Windows의 내장 기능 만 사용하여 명령 프롬프트에서 파일을 압축하여 파일을 압축 할 수 있습니까?


111

텍스트 파일을 출력하는 배치 파일이 있습니다. 나는 그것을 지퍼로 묶을 수 있다면 좋을 것이라고 생각했다.

이것은 통제되지 않은 환경에서 사용될 것이므로 7-Zip 등과 같은 타사 소프트웨어 제품의 존재에 대해 가정 할 수 없습니다 .이 기능은 Windows의 기본 제공 기능을 사용하여 파일을 압축해야합니다.


1
Powershell 또는 WSH 스크립팅을 활용할 수 있습니까? 이것이 명령 줄에서 Windows의 기본 우편 처리를 사용하는 유일한 방법 일 수 있습니다. 그렇지 않으면 Molly가 지적했듯이 타사 도구가 필요합니다.
quack quixote

1
그래서 당신은 누군가에게 배치 파일을 보내고 그에게 정적으로 링크 된 작은 gzip.exe를 보낼 수 없습니까?
akira

OP의 질문은 훌륭한 질문이다 (@quackquixote의 이상한 비난에도 불구하고). Windows는이를 SendTo에서 한 번의 클릭으로 제공하므로 BAT 파일에서 사용할 수있는 명령 이 있어야 합니다. 따라서 대답이 '아니요'이고 동등한 도구 일 수도 있고 그렇지 않을 수도있는 타사 도구를 사용해야하는 경우에도 좋은 질문입니다.
Jon Coombs

이것은 링크 토마스에 의해 폴더의 내용을 압축하는 잘 작성된 스크립트를 가지고있다. 작동하게하려면 스크립트를 배치 파일로 복사하고 압축 할 폴더를 지정하여 실행하십시오 (소스). 스크립트에서 데스크탑 ( "% USERPROFILE % \ Desktop")으로 기본 설정되어 있으므로 대상 디렉토리를 언급 할 필요가 없습니다
Abhijeet

3
simpliest는 cmd를 프롬프트에서, 다음과 같습니다 powershell.exe Compress-Archive file-to-zip.txt zippedfile.zip(너무 폴더와 함께 작동)
ThomasGuenet

답변:


85

다음은 이름이 지정된 파일을 압축하여 c:\ue_english.txt넣는 모든 배치 파일 솔루션 (다른 답변의 변형)입니다 C:\someArchive.zip.

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\someArchive.zip

pause

에 저장된 폴더의 상위 항목에 대한 쓰기 권한이 필요합니다 TEMPDIR. 그렇지 않은 경우가 많으므로 C 드라이브의 루트를 TEMPDIR변경해야 할 수도 있습니다.

.bat스크립트가 있는 폴더에 대한 쓰기 액세스도 필요합니다 (파일을 생성 할 때).

또한 압축 파일의 파일 확장자는이어야합니다 .zip. 다른 확장을 사용하려고하면 스크립트 오류가 발생할 수 있습니다. 대신 .zip파일을 생성 하고 이름을 바꾸십시오.


3
@quack 나는 내가 모르는 불분명 한 명령을 희망하여 개최되었습니다. 어려운 요구 사항이 존재하지 않는 경우 아무도 내놓지 않았다는 것을 어떻게 알 수 있는지 알 수 있습니다.
Aaron Bush

@PeterMortensen : Powershell을 통해 이것이 얼마나 단순화되는지 보는 것이 흥미로울 수도 있고 아닐 수도 있습니다. 여기에 5 줄 예제 가 있지만 Pscxwrite-zip 에서 다운로드 할 수 있는 cmdlet 도 있습니다 .
타마라 Wijsman

ZIP을 만족시키기 위해 zip.exe와 cywin1.dll (3mb)을 사용했으며 사용법은 한 줄입니다 ... 일부 배치 코드를 사용하는 ZIP 자체입니다. argv와 함께 PHP bancompile'd를 사용하고 파일을 전달할 수 있다는 것을 알고 있습니다. 멋진데. "윈도우 커맨드 라인의 zip"은 오래된 공상 과학 영화입니다.
erm3nda

왜 임시 폴더를 사용해야 TEMPDIR합니까? 파일 FILETOZIP을 폴더 로 감싸는 것이 당신의 의도라고 생각 하십니까?
Nam G VU

@ Peter Mortensen, 나는 이것이 오래된 스레드라는 것을 알고 있으며 이것은 내가 찾고있는 거의 것입니다. 하나의 큰 파일을 더 작은 청크로 압축하는 옵션이 있습니까?
JohnG

38

이다 추가 소프트웨어 (나는 그것을 테스트 한)를 설치하지 않고 파일을 압축 할 수. 해결책은 다음과 같습니다.

이를 명령 행 창에서 실행 C:\someArchive.zip하여 폴더의 모든 파일을 포함 하는 ZIP 파일을 작성하십시오 C:\test3.

CScript  zip.vbs  C:\test3  C:\someArchive.zip

파일 zip.vbs에 다음이 포함되어 있습니다.

' Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

' Create an empty ZIP file.
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)

Set objShell = CreateObject("Shell.Application")

Set source = objShell.NameSpace(InputFolder).Items

objShell.NameSpace(ZipFile).CopyHere(source)

' Required to let the ZIP command execute
' If this script randomly fails or the ZIP file is not complete,
' just increase to more than 2 seconds
wScript.Sleep 2000

공백이 포함 된 경로 및 파일 이름에 대해서는 테스트하지 않았습니다. 명령 줄 매개 변수를 따옴표로 묶으면 작동 할 수 있습니다.


작동 방식 : Windows에 내장 된 zip 기능 (Windows XP 이상)은 Windows 셸인 explorer.exe의 COM 인터페이스 ( "Shell.Application"부분 )를 통해 노출됩니다 . 이 COM 인터페이스는 VBScript 스크립트 에서 사용할 수 있습니다. 이러한 스크립트는 COM 구성 요소에 액세스 할 수 있기 때문입니다. 스크립트를 완전히 독립적으로 만들기 위해 빈 ZIP 파일을 만들어 시작할 수 있습니다 (빈 ZIP 파일을 만들어 VBScript 스크립트와 함께 대상 시스템에 복사 할 수도 있습니다).

VBScript는 Windows 98 이후 Microsoft Windows의 모든 데스크탑 릴리스에 기본적으로 설치되었습니다.

CScript.exeWindows Script Host의 일부입니다 . Windows 스크립트 호스트는 기본적으로 Windows 98 이상 버전의 Windows에서 배포 및 설치됩니다. Internet Explorer 5 이상 버전이 설치된 경우에도 설치됩니다.


1
+1 "그냥 실행"되는 좋은 솔루션이지만 목록에없는 몇 가지 다른 이유로 BAT를 선택합니다. 따라서 BAT 솔루션을 선호합니다.
Aaron Bush

4
@Aaron Bush :이 스크립트와 Beaner 's는 요청에 따라 Windows 내장 함수를 사용하여 명령 줄에서 파일을 압축하는 명령을 제공합니다. 다른 명령처럼 배치 파일에 해당 명령을 추가 할 수 있습니다.
quack quixote

전달 된 경로는 상대 경로가 아니라 절대 경로 여야합니다. 또한 여기에 대한 대답의 기술을 사용했다 : stackoverflow.com/q/1645843/99640
척 윌버

경로는 절대적이어야하고 무작위로 실패하는 것 같습니다 :(
kixorz

답변으로 선택해야합니다.
마샬 공작 שלום

12

당신이 사용하는 열려있는 경우 PowerShell을 , 우편 기능 (PowerShell에서 .NET입니다) .NET 2.0에서 사용할 수 있습니다. 다음은 Mike Hodnick 의 사례 ( 출처 )입니다 .

########################################################
# out-zip.ps1
#
# Usage:
#    To zip up some files:
#       ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
#    To zip up a folder:
#       gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}

이것은 기본적으로 다른 답변의 CScript 코드와 동일합니다. .NET 기능이 사용되지 않습니다 (그리고 .NET은 ZIP을 지원하지 않습니다). 나는 이것이 또한 타이밍 문제에 민감 할 것으로 생각합니다.
Robert Schmidt

2
.NET System.IO.Compression.ZipFile 클래스는 버전 4.5에 추가되었습니다.
콘크리트 가넷

7

압축 대화 상자 창의 존재를 폴링하여 압축 중 시간 종료 위험을 제거 할 수 있습니다. 이 방법은 또한 사용자가 압축 창을 취소하는 것을 처리합니다.

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop  

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop

1
+1. 그 코드 원숭이 스타일 " .Sleep(whatever)"은 나를 아프게한다.
ivan_pozdeev

1
대기하기 위해 위의 논리를 사용하여 vbs를 실행하는 경우 예약 된 작업 (사용자가 실제로 로그인하지 않은 상태)을 통해 시작된 경우 어떻게 처리
Wes

5

Resource Kit Tools 를 설치할 수있는 경우 zip과 같은 압축 된 아카이브 파일을 작성할 수있는 COMPRESS라는 명령 행 도구를 찾을 수 있습니다.

Microsoft (R) File Compression Utility  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r            Rename compressed files.
  -d            Update compressed files only if out of date.
  -zx           LZX compression.
  -z            MS-ZIP compression.
  -zq[n]        Quantum compression and optional level
                (in range 1-7, default is 4).
  Source        Source file specification.  Wildcards may be used.
  Destination   Destination file | path specification.
                Destination may be a directory.
                If Source is multiple files and -r is not specified,
                Destination must be a directory.

3
+1 실제로 해결하지는 않지만 알아두면 좋습니다.
Aaron Bush

3
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop

내가 찾던 정확히 .. 그러나 그것은 "빈 Zip 파일에 누락"오류가 발생합니다
Sonic Soul

어떤 이유로 든 이것이 증가하지 않습니다 objShell.NameSpace( ZipFile ).Items.Count. 루프 내부에 인쇄 하면 zip 파일이 생성되고 내부에 예상되는 내용이 있어도 항상 0입니다.
Thom Nichols

2

코드가 단순화 된 여러 파일 / 디렉토리

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

zip.vbs 파일

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
  zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next

2

이것은 받아 들여진 대답의 돌연변이입니다. 한 번에 최대 수천 개의 파일에 대해 수많은 자동화 작업을 수행하므로 2 초 동안 잠을 잘 수 없으며 신경 쓰지 않아도됩니다. 여기서 해결 방법 을 모았 습니다 . 이 방법 은 Jiří Kočara의 답변과 비슷합니다 .

이렇게하면 대상 폴더가 200ms마다 핑 (ping)됩니다. 이는 Microsoft가 FS 업데이트를 확인하는 속도만큼이나 빠릅니다.

Set parameters = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
SourceDir = FS.GetAbsolutePathName(parameters(0))
ZipFile = FS.GetAbsolutePathName(parameters(1))
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set shell = CreateObject("Shell.Application")
Set source_objects = shell.NameSpace(SourceDir).Items
Set ZipDest = shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
    wScript.Sleep 200
Loop

1

Here'a 압축 및 압축 해지를위한 내장 기능 창을 요약 내 시도 - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders을 배치 -f

거의 모든 Windows 시스템에서 작동하는 몇 가지 솔루션이 있습니다.

shell.application 및 WSH와 관련하여 임시 파일이 필요없는 하이브리드 배치 / jscript 파일 (.bat 확장자 포함)을 허용 하므로 jscript 를 선호했습니다. 압축 및 압축 기능을 하나의 파일에 추가하고 몇 가지 추가 기능을 추가했습니다 .


0

Windows 8 또는 Windows Server 2012의 경우 PowerShell 및 .NET 4.5가 있으므로 다음을 수행 할 수 있습니다.

zip.ps1 (사용 :)-directory <directory to zip up> -name <zip name> :

param (
    [string]$directory,
    [string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

zip.bat (PowerShell을 호출하기 위해 헬퍼가 필요한 경우 디렉토리가 첫 번째 인수이고 zip 이름이 두 번째 임) :

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"

0

Windows 10 빌드 17063 이상에는 명령 줄에서 zip으로 작업 할 수있는 tar.exe가 번들로 제공됩니다.

tar.exe -xf archive.zip

또는 아카이브를 만들려면

tar.exe -cf Test.zip Test

-5

Windows 명령 줄은 이제 압축 명령을 제공합니다.이 명령은 Windows 고유의 것입니다. 내가 놓친 것이 없다면 요청 된 요구 사항을 충족해야합니다.


9
compactXP 이후로 존재하며 NTFS 압축을 관리하는 도구입니다.
Der Hochstapler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.