Windows의 내장 기능 만 사용하여 스크립트에서 압축 또는 압축 해제를 어떻게 할 수 있습니까?


294

Windows에서는 다음과 같은 방법으로 일부 파일을 압축 할 수 있습니다

마우스 오른쪽 버튼을 클릭 → 보내기 → 압축 (압축) 폴더

.zip파일 을 두 번 클릭하여 압축을 풀고 파일을 추출하십시오.

타사 소프트웨어를 설치할 필요없이 스크립트 (.bat 파일)에서 이러한 기능을 적용하는 방법이 있습니까?



16
아마도 배치 파일이나 프로그램에서 호출하기 때문일 것입니다. (내가 여기 왜의는 - 그것은 zip 파일로 필요로하는 웹 사이트에 대한 작은 제품 "빌드"에 대한 빠른 .BAT 파일을 만들려고 노력.)
— 존 쿰즈

46
이 질문이 닫히는 것을 미쳤다.
— Sam Goldberg

1
이 질문을 슈퍼 유저로 옮길 수 있습니까?
— Hanxue

21

답변:


82

2013 년에는 불가능했습니다. Microsoft는 이에 대한 실행 파일을 제공하지 않았습니다.

이 작업을 수행하는 VBS 방법은이 링크를 참조하십시오. /superuser/201371/create-zip-folder-from-the-command-line-windows

Windows 8부터는 .NET Framework 4.5가 기본적으로 설치되며 System.IO.Compression.ZipArchive 및 PowerShell을 사용할 수 있으며 스크립트를 작성할 수 있습니다 ( https://stackoverflow.com/a/26843122/71312 참조).


1
PS가이를 허용하고 Windows에 사전 설치되어 있으며 명령 줄을 통해 사용할 수 있다는 점을 감안하면 올바르지 않습니다.
— Dan Atkinson

4
@DanAtkinson이 업데이트되었습니다. 이 링크는 2013 년에 답변을 받았으며이 링크는 VBS 방식을 제공했습니다. PS 방식에는 Windows 8 이상이 필요한 .Net 4.5가 필요합니다.
— Diryboy

업데이트 해 주셔서 감사합니다! 이에 따라 내 투표를 수정했습니다. :)
— Dan Atkinson

6
@MichaelMrozek 음 "명령 줄"은 일반적으로 CMD / COMMAND가 아닌 모든 명령 줄을 의미하며 PS는 * nix의 bash, sh, rsh와 마찬가지로 명령 줄입니다. 그러나 명령 줄에서 powershell을 실행할 수 있으므로 cmd / command가 유일한 명령 줄이라고 믿더라도 질문에 대답합니다.
— Robert McKee

1
그것은 이었다 (어떤 추가 소프트웨어를 설치하지 않고) 2013 년, 백. 수퍼 유저 질문을 참조하십시오 . Windows XP 는 2001 년에 나온 이후에 가능했습니다. Windows XP 의 기본 제공 ZIP 기능은 COM 인터페이스를 통해 노출되므로 활용할 수 있습니다 .
— Peter Mortensen

180

Steven Penny의 PowerShell 솔루션을 확장하려면 다음과 같이 powershell.exe를 호출하여 배치 파일에 통합 할 수 있습니다.

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

Ivan Shilo가 말했듯이 PowerShell 2에서는 작동하지 않으므로 PowerShell 3 이상 및 .NET Framework 4가 필요합니다.


1
실제로 이것은 .NET 4.5에서 제공되었습니다.
— qJake

10
새 디렉토리를 만드는 대신 실제 디렉토리로 추출하는 방법을 궁금해하는 사람들 (나 같은 사람)의 경우 대상 매개 변수를 간단히 다음과 같이 설정하십시오 '.'.powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
— Munchkin

압축을 높이기 위해이 명령을 사용할 수 있습니까? 파일 크기를 줄이려면 매우 압축해야합니까?
— Nigel Fds

1
의 목적은 & {}무엇입니까? PS5로도 작동합니다 :powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
— Roi Danton

@RoiDanton src.zip 및 dest.zip을 정의하기 위해 stringformatter를 사용하는 방법은 무엇입니까?
— PySaad

161

현재 .NET 4.5 , PowerShell은이 작업을 수행 할 수 있습니다 :

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

마지막 두 줄을 위해, bar그리고 foo당신이 가진 폴더를하고자하는 이름으로 대체 할 수있다, 또는 어떤 이름은 기존의 폴더입니다. foo.zip두 경우 모두 zip 파일로 작동하여 저장하거나 압축을 해제합니다.


17
이것은 .NET 4.5 기준입니다.
— qJake

압축을 높이기 위해이 명령을 사용할 수 있습니까? 파일 크기를 줄이려면 매우 압축해야합니까?
— Nigel Fds

여기에서 설치된 VM을 통해 .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705가 설치되어 있습니다 : developer.microsoft.com/en-us/microsoft-edge/tools/vms . .NET 4.5가 필요하지
— 않은 것 같습니다

이것은 현대 시스템에서 가장 실용적인 솔루션이며, 2GB 이상의 크기로 압축을 작성하는 반면 표준 Powershell "Compress-Archive"는 실패합니다.
— Shukri Adams

135

Java를 설치 한 경우 다음 jar명령을 사용하여 ZIP 아카이브로 압축 할 수 있습니다 .

jar -cMf targetArchive.zip sourceDirectory

c = 새 아카이브 파일을 만듭니다.

M = 매니페스트 파일을 아카이브에 추가하지 않도록 지정합니다.

f = 대상 파일 이름을 나타냅니다.


3
최고, 감사, 단지 제가 참고를 위해 ...보고 있었다 - 나는 ... DOS에서 예를 들어 항아리 CMF target.zip SOURCEDIR 마이너스 문자를 제거했다
— mlo55

3
나쁘지는 않지만 JRE가 아닌 JDK가 설치되어 있어야합니다.
— pdem

2
좋은 하나, 아마도 가장 플랫폼 독립적 인 솔루션입니다.)
— Adrian

YMMD. 멋진 생각입니다. 많은 시간을 절약했습니다.
— gorefest

3
이 적용되어 "사용 ... 전용 윈도우 내장의 기능을?" (내 강조)
— Peter Mortensen

84

PowerShell 5.0

에서 Microsoft.PowerShell.Archive사용할 수 :

예 :

  • result.zip전체 Test폴더 에서 작성하십시오 .

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • result.zip지정된 Test폴더 에서 의 내용을 추출하십시오 .

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    

13
이것은 잘 작동합니다, 감사합니다. 여기까지 오는 사람이라면 powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zip스크립트를 만들 필요없이 명령 줄에서 바로 사용할 수 있습니다 (Powershell v5가 설치되어 있고 최소한 Windows 7로 돌아갈 수 있다고 가정).
— Beems

재실행을 계획하고 있다면 -Force 옵션을 추가하십시오.
— Robin Salih

1
@Beems, 감사합니다! 그러나 나는 당신이 다른 방법으로 경로 / 목적지를 화나게했다고 생각합니까?
— Yiping

이 작품은,하지만, 아카이브는 다르게 다음 탐색기 창을 사용하는 경우 발생하는 압축 "대상을 보낸을 -> 압축 (ZIP) 폴더는"파워 쉘 버전이 더 큰이며, 일부 프로그램은 추출 할 수 없습니다
— 에릭 Labashosky

압축 아카이브는 입력 파일에서 최대 파일 크기가 2GB입니다.
— Sergei Rodionov

37

ZIP은 아니지만 Windows 도구를 사용하여 파일을 압축하는 유일한 방법은 다음과 같습니다.

makecab <source> <dest>.cab

압축을 풀려면

expand <source>.cab <dest>

고급 예 (ss64.com) :

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

추가 정보 : makecab , expand , makecab advanced uses



34

7-Zip 사용 :

우편 번호 : 폴더 foo가 있으며 압축을 풉니 다myzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

압축 풀기 : 압축을 풀고 싶습니다 ( myzip.zip)를 현재 디렉토리 ( ./)로

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r

31
질문에 주목하십시오 :without the need to install any 3rd party
— Roee Gavirel

16
@RoeeGavirel 7zip은 Windows 설치시 가장 먼저 설치해야하는 것 중 하나입니다. : P
— developerbmw

3
@developerbmw-A. 왜 그렇습니까? B. 나는 7zip이없는 생산에서 ~ 100 대의 기계를 취급하고 있습니다. 이를 설치하려면 DevOps가 모든 시스템과 클러스터에 추가 될 모든 새 시스템에 설치해야합니다. 오히려 그것을 피하고 싶습니다.
— Roee Gavirel

1
@Roland : 당신이 제발있을 수 있을까; 어디가 잘못 되었나요? 그것은 모두를 도울 것입니다.
— Monir

1
@Roland : 방금 확인했는데 구문이 제대로 작동합니다. 컴퓨터에없는 "foo"폴더를 사용하고있을 것입니다. 그래도 추측하십시오.
— Monir

9

나는이 정확한 질문에 대답하려고 노력했으며 내 연구에서 DiryBoy의 대답은 정확한 것 같습니다.

compact.exe 프로그램이 파일을 압축하지만 압축률이 높은 파일 (또는 파일 세트)을 만들지 않는 것을 발견했습니다. Windows에서 드라이브 문자 나 파티션을 마우스 오른쪽 버튼으로 클릭 할 때 얻는 옵션과 유사합니다. 파일을 압축 할뿐만 아니라 정리 (임시 파일 제거 등) 옵션도 제공됩니다. 압축 파일은 여전히 ​​액세스 가능하지만 공간이 부족한 드라이브에 공간을 만들기 위해 압축되었습니다.

또한 컴퓨터에있는 compress.exe를 발견했습니다. 기본적으로 대부분의 Windows 시스템에는 없으며 2003 Resource Kit의 일부입니다. 압축 파일을 만들지 만 실제로 Windows 설치 디스크의 파일과 비슷합니다 (파일 확장자 또는 이름의 마지막 문자로 밑줄이 있음). extract.exe 명령은 해당 파일을 추출합니다.

그러나 GUI를 통해 기본적으로 수행 할 수있는 명령은 명령 줄 내에서 배치, .vbs 또는 다른 유형의 스크립트를 통해 수행 할 수 있습니다. Windows는 zip 파일을 만드는 '보내기'옵션을 가지고 있었으므로 명령 줄을 통해 파일을 작성하는 방법이 있어야한다는 것을 알고 몇 가지 옵션을 찾았습니다.

다음은 Windows 기본 명령을 사용하여 파일을 압축하는 방법을 보여주는 훌륭한 링크입니다.

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

여러 개의 중첩 파일과 폴더가 들어있는 디렉토리로 테스트했으며 완벽하게 작동했습니다. 명령 행의 형식을 따르십시오.

내가 찾은 명령 줄을 통해 파일을 압축 해제하는 방법도 있습니다. 한 가지 방법은 압축 파일의 내용을 보여주는 탐색기 창을 여는 것입니다. 이것들 중 일부는 Java를 사용하는데, 이는 반드시 Windows 고유의 것은 아니지만 너무 일반적이므로 거의 그렇게 보입니다.

/superuser/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

명령 행을 사용하여 파일을 압축 해제하는 방법은 무엇입니까?



8

BAT 파일로 랩핑 된 VBScript 스크립트를 사용할 수 있습니다. 이 코드는 상대 PATH에서 작동합니다.

타사 도구 나 종속성이 필요하지 않습니다. 그냥 설정 SOURCEDIR하고 OUTPUTZIP.

파일 이름 : ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

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

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

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

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

사용법 예

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

또는 줄 CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%을 으로 바꾸어이 파일을 매개 변수화 할 수 있습니다.이 CScript _zipup.vbs %1 %2경우 단순히을 호출하여 더 쉽게 호출 할 수 있습니다 CALL ZipUp C:\Source\Dir C:\Archive.zip.


초기 zip 파일을 생성하는 행은 이스케이프 처리해야합니다. 그렇지 않으면 스크립트에서 끝나지 않습니다.
— cup

예, 이것은 수퍼 유저 질문 과 같이 갈 수있는 방법 입니다.
— Peter Mortensen

답변으로 올바르게 이스케이프 된 버전을 추가했습니다.
— fsteff

5

이 모든 솔루션에 문제가 있습니다.

그것들은 정확히 동일 하지는 않으며 , 모두 RMB --> send to --> compressed (zipped) folder동일한 소스 폴더에서 만든 것 보다 약간 크기가 다른 파일을 만듭니다 . 내가 가진 가장 가까운 크기 차이는 다음과 같이 만든 300KB 차이 (스크립트> 설명서)입니다.

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(주목하라 -CompressionLevel . 세 가지 값이 있습니다 : 가장 빠른, NoCompression 및 최적의가 (기본 : 최적))

작업중인 WordPress 플러그인 폴더를 .zip 아카이브로 자동 압축해야하는 .bat 파일을 만들고 싶었습니다. 따라서 WordPress 사이트에 업로드하고 플러그인을 테스트 할 수 있습니다.

그러나 어떤 이유로 든이 자동 압축 에서는 작동하지 않지만 수동 RMB 압축에서는 작동 하지만 마녀는 정말 이상합니다.

그리고 스크립트로 생성 된 .zip 파일은 실제로 WordPress 플러그인을 활성화 할 수없는 지점까지 손상 시키며 WordPress 내부에서도 삭제할 수 없습니다. 서버의 "뒷면"에 SSH로 접속하여 업로드 된 플러그인 파일 자체를 수동으로 삭제해야합니다. 수동으로 RMB에서 생성 된 파일은 정상적으로 작동합니다.


무엇 "WBR" 및 "RMB"는 ?
— Peter Mortensen

RMB = 마우스 오른쪽 버튼. <wbr> = 브라우저에 "Word BReak 기회"를 나타내는 HTML 태그 (작동하지 않아 제거됨).
— Sebastian Norr

4

스크립트의 일부로이를 수행해야하는 경우 가장 좋은 방법은 Java를 사용하는 것입니다. bin 디렉토리가 경로에 있다고 가정하면 (대부분의 경우) 명령 행을 사용할 수 있습니다.

jar xf test.zip

Java가 경로에 없으면 직접 참조하십시오.

C:\Java\jdk1.6.0_03\bin>jar xf test.zip

3

오픈 소스는 당신의 친구입니다 :-)

압축 해제 는 다음과 같습니다 . http://gnuwin32.sourceforge.net/packages/unzip.htm

ZIP 명령도 있습니다 : http://gnuwin32.sourceforge.net/packages/zip.htm

바이너리 다운로드가 충분하다.


Windows 8에서는 오류 : bzip2.dll이 누락되었습니다.
— Doug

1
@Doug에 따르면 bzip2는 페이지의 요구 사항이며 다운로드 링크가 있습니다.
— Sam

11
원래 질문은 표준 내장 Windows 명령을 사용하는 방법이었습니다. 또한 사용자가 자신의 도구 나 솔루션을 컴퓨터에 대한 관리 권한이 있거나 시스템에 대한 의존도가 점점 커지는 사용자에 국한되지 않기 때문에 사용자에게 다양한 타사 솔루션을 설치하도록 요구하는 것은 바람직하지 않습니다. . 오픈 소스는 친구 일 수도 있지만 다른 오픈 소스 패키지를 설치해야하는 다른 오픈 소스 패키지를 설치해야하는 오픈 소스 패키지는 친구가 아닙니다 .
— Steve Hollasch 2016 년

SourceForge는 내 방화벽 정책에 의해 차단되었습니다 :-(
— SnookerC

1
이것은 여전히 타사 sotware를 사용
— Деян Добромиров에게

3

이것은 @ PodTech.io가 제공 한 답변으로 업데이트 된 버전입니다.

이 버전은 모든 vbs 코드가 배치 파일에서 올바르게 이스케이프되었습니다. 또한 서브 루틴으로 만들어져 배치 스크립트의 어느 곳에서나 한 줄로 호출 할 수 있습니다.

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof

2

타사 소프트웨어 없이이 작업을 수행하려고한다고 말합니다. .NET "타사"소프트웨어를 고려할 것인지 잘 모르겠습니다.

그러나 .NET에서 고유 한 명령 줄 유틸리티를 만들 수 있습니다. 몇 줄 이상의 코드가 필요하지 않습니다.

ZipFile 클래스


0

@Jason Duffett의 답변 과 주석을 추가 하면 사용자로부터 입력 및 출력 (각각 파일 이름 및 디렉토리 이름) 을 얻는 스크립트가 있습니다.

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

용법:

unzip.bat path\to\file.zip path\to\output\directory

-4

파일을 압축하려면

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 최대 압축
  • -m 압축 성공 후 원본 파일 삭제
  • -o zip 파일의 수정 날짜를 원본 파일과 동일하게 설정
  • 너무 나쁜 것은 압축 할 파일의 이름에 .zip 확장자를 추가하는 대신 원하는 zip 파일의 이름을 지정해야합니다

4
두 가지 : (1) "zip"은 창과 함께 제공되지 않으므로 아마도 제 3 자일 것입니다. 내 질문에서 언급했듯이 타사를 설치할 수 없습니다. (2) 원하는 이름을 제공해야하는 이유는 압축 파일의 생성 및 보관 (예 : 폴더의 보안 폴더)에 둘 이상의 파일이있을 수 있기 때문입니다.
— Roee Gavirel

@RoeeGavirel 서버에서 zip 명령 줄 유틸리티에 winzip GUI 도구가 설치되어 있지 않으므로 베어 CLI 도구가 Windows와 함께 제공되는 것 같습니다. 한편, compress, bzip2 및 gzip과 같은 Unix / Linux 압축 유틸리티는 원하는 이름을 전달하지 않으면 동일한 원본 파일 이름과 확장자 (.Z, .bz2 또는 .gz)로 압축 파일을 만듭니다. 압축 파일.
— Tulains Córdova 2019

-4

다음과 같이 확장 명령 을 사용하여 압축 또는 기본 압축 Windows 파일을 압축 해제 할 수 있습니다.

expand MyFile.zip myFile

9
시도했지만 MyFile.zip을 myFile 폴더에 복사합니다.
— fhnaseer

이것은 C : \> expand /?
— snow6oy

11
확장은 .cab 파일에서만 작동하며 zip 파일에는 적합하지 않습니다.
— рüффп

2
다른 의견은 여기에 있습니다. Expand file.zip file확장명없이 zip을 다른 파일로 복사하기 만하면됩니다. ZIP을 폴더로 압축 해제하지 않습니다.
— Dave Marley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.