コマンドラインから.zipフォルダーを作成する-(Windows)


57

コマンドラインのフォルダーから.zipファイルを作成することは可能ですか、サードパーティの実行可能ファイルは使用しません。

私は「圧縮フォルダに送信」のようなものを考えていましたが、それを行う方法がわかりません...


2
Windowsリソースキットには、というツールがありますcompress.exe
ho1

2
ここではServerFaultの質問へのリンクがありますことを議論ちょうどこの:serverfault.com/questions/39071/...
HO1

回答:



7

Windowsに組み込まれているZIPファイル用のコマンドラインはないと思います(compressServer 2003 Resource Kit 以外)。サードパーティを使用する必要があります。誰もが7zipが大好き!


6

ニーズに合わせて、このスクリプトをいくつかの異なるソースから組み合わせました。スクリプトをコピーして、拡張子が「.vbs」のファイルに貼り付けます。このスクリプトはもともとWindows XP用に作成されましたが、Windows 7 x64 Ultimateでも機能します。Windowsが使用するさまざまなシェルオブジェクトを保持するかどうかは保証されません。

使用法:実行ボックスまたはコマンドラインでput-

"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"

スクリプトへのパス、ソースフォルダー、作成するzipファイル(末尾に.zipを含む)。

空のフォルダはコピーされませんので注意してください。

これがvbsコードです---

Set Args = Wscript.Arguments
source = Args(0)
target = Args(1)

' make sure source folder has \ at end
If Right(source, 1) <> "\" Then
    source = source & "\"
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set zip = objFSO.OpenTextFile(target, 2, vbtrue)
' this is the header to designate a file as a zip
zip.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) )
zip.Close
Set zip = nothing

wscript.sleep 500

Set objApp = CreateObject( "Shell.Application" )
intSkipped = 0

' Loop over items within folder and use CopyHere to put them into the zip folder
For Each objItem in objApp.NameSpace( source ).Items
    If objItem.IsFolder Then
        Set objFolder = objFSO.GetFolder( objItem.Path )
        ' if this folder is empty, then skip it as it can't compress empty folders
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then
            intSkipped = intSkipped + 1
        Else
            objApp.NameSpace( target ).CopyHere objItem
        End If
    Else
        objApp.NameSpace( target ).CopyHere objItem
    End If
Next

intSrcItems = objApp.NameSpace( source ).Items.Count
wscript.sleep 250

' delay until at least items at the top level are available
Do Until objApp.NameSpace( target ).Items.Count + intSkipped = intSrcItems
    wscript.sleep 200
Loop

'cleanup
Set objItem = nothing
Set objFolder = nothing
Set objApp = nothing
Set objFSO = nothing

1
ルックスは有望、私は必要な「オブジェクトを得ました: 『objApp.NameSpace(...)』行16にエラーを
pihentagy

私は同じ問題を抱えています。上記のコードは機能しないか、投稿者が言及するのを忘れたシステムに追加のものが必要です。
-Shaamaan

WScript(vbs環境)といくつかのシェルオブジェクトを使用します。すべては、Windows XP(ビジネス?)およびWin 7 Ultimate x64にデフォルトでインストールされました。おそらく、彼らはWin8のためにもっと長いのですか?
WSkid

2

BATからPowerShellスクリプトを実行することが可能です。Batファイルは、圧縮するdirへのパスとパラメーターとしてzipファイル名を受け取ります。

@echo off
setlocal

rem First parameter - path to dir to be zipped
rem Second parameter- zip file name
set sourceDir=%1
set zipFile=%2

rem Create PowerShell script
echo Write-Output 'Custom PowerShell profile in effect!'    > %~dp0TempZipScript.ps1
echo Add-Type -A System.IO.Compression.FileSystem           >> %~dp0TempZipScript.ps1
echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1

rem Execute script with flag "-ExecutionPolicy Bypass" to get around ExecutionPolicy
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'"
del %~dp0TempZipScript.ps1
endlocal

1
しかし、このアプローチの利点は何でしょうか?PowerShellスクリプトを固定ファイルに書き込み、パラメーターを受け入れるようにしないのはなぜですか?
セス

他のすべてのソリューションを試しました。これは、完全に機能する唯一のフェイルセーフソリューションです。最も重要な利点は、powershellのネイティブコマンドを使用することであり、旧式のVBScriptを作成する必要はありません。
デスマティ

これは、2019年に旧法人Windows7のラップトップ上で私のために働いた
simbo1905

1

Windowsネイティブコマンドを使用してファイルを圧縮する方法を示す優れたリンクを次に示します。

Windowsに組み込まれているファイル圧縮機能のみを使用して、コマンドプロンプトからファイルを圧縮できますか?

複数のネストされたファイルとフォルダーを含むディレクトリでテストし、完全に機能しました。コマンドラインのフォーマットに従うだけです。

私が見つけたコマンドライン経由でファイルを解凍する方法もあります。1つの方法は、zipファイルの内容が何であるかを示すエクスプローラウィンドウを開くだけです。これらの一部はJavaを使用しますが、これは必ずしもウィンドウにネイティブではありませんが、非常に一般的であるため、ほとんどそう思われます。

Windows 7には、デフォルトでコマンドラインにunzipがインストールされていますか?

https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line


3
回答に指示を含める必要があります。リンクが古くなると、あなたの答えは役に立たなくなります...
MoonSire

1

これは古い質問ですが、その関連性は依然として最新です。

もちろん、Windowsにはzipファイルを使用するための独自の圧縮アルゴリズムが組み込まれていますが、こちらのhttp://www.7-zip.org/にある7zipオープンソース製品と比較すると、パフォーマンスが非常に低くなっています。

他の人はすでにビルトインウィンドウ機能を使用するための様々な方法を議論しています、私のソリューションは追加のソフトウェアをインストールする必要があります。

7Zipは、ZIP、RAR、CAB、ISOなどの幅広いファイルをサポートし、独自の7z形式をサポートしています。

コマンドラインヘルプを表示できます: "C:\ Program Files \ 7-Zip \ 7z.exe" --help

zipアーカイブに簡単な追加を実行するには:

「C:\ Program Files \ 7-Zip \ 7z.exe」a filename.zip c:\ path


1

4つの異なるソースからの別のアイデアがあります。私のアイデアではありませんが、私のためにそれを機能させるためにそれらをコンパイルしました

<!-- : Begin batch script
@each off

set sourceFolder="c:\test"
set destZip="%userprofile%\desktop\example.zip"

cscript //nologo "%~f0?.wsf" //job:exewsh %sourceFolder% %destZip%

exit /b
GOTO:EOF
----- Begin wsf script --->
<package><job id="exewsh"><script language="VBScript">
'Get command-line arguments.
Set objArgs = WScript.Arguments
InputFolder = objArgs(0)
ZipFile = objArgs(1)

'Create 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!
wScript.Sleep 2000
</script></job>
</package>

2
スーパーユーザーへようこそ!これは明らかに複雑なスクリプトです。それが何をするのか、そしてそれをどのように使用するのか説明してもらえますか?
jpaugh

1

PowerShellのウィンドウを開かずに、コマンドプロンプトと同じフォルダーを圧縮するとします。

powershell Compress-Archive . publish.zip

それは私がやろうとしたことではありませんでしたが、今ではうまくいきます。これは知っておくと便利なトリックです。
bballdave025

0

残念ながらコメント機能を使用できないため、WSkidsの回答に関連するものを投稿します。

VBSでCopyHere()メソッドを使用すると、いくつかの問題が発生します。これらの問題の1つは、コピープロセスがバックグラウンドで開始されている間にメソッドがすぐに戻るのに対して、複数のCopyHere()呼び出しが互いに干渉し、ZIPが正しく作成されないことです。これを修正するには、ここで待機ループが必要です。私の待機ループは、ここに投稿された同様の問題への回答に基づいています

pihentagyによって報告された「Object required」エラーを修正する更新バージョンがあります。スクリプトが高速マシンで実行されると、新しく作成されたZIPファイルがItemsコレクションに含まれるため、タイミングの問題です。

set Args = WScript.Arguments
source = Args(0)
' remove trailing slashes as we add slashes when needed later
while Right(source, 1) = "\"
    source = Mid(source, 1, Len(source) - 1)
wend

target = Args(1)

' create empty ZIP file
set fso = CreateObject("Scripting.FileSystemObject")
set zip = fso.OpenTextFile(target, 2, vbtrue)
' write ZIP header, this ensures that Windows recognizes the file as "ZIP Folder"
zip.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
zip.Close
set zip = nothing
set fso = nothing

' copy files to ZIP file
set app = CreateObject("Shell.Application")

set sourceFolderObj = app.NameSpace(source)
set targetFolderObj = app.NameSpace(target)

for each item in sourceFolderObj.Items
  itemPath = source & "\" & item.Name

  copyItem = false

  ' ZIP file is included in Items collection and is recognized as folder, thus skip it to avoid script errors
  if itemPath <> target then
    if item.IsFolder then
      if item.GetFolder.Items().Count = 0 then
        ' folder is empty, skip it as empty folders can't be compressed
      else
        copyItem = true
      end if
    else
      copyItem = true
    end if
  end if

  if copyItem then
    targetFolderObj.CopyHere item

    ' wait until the file appears in the ZIP file, 
    ' this is needed because CopyHere() returns immediately after starting an asynchronous copy process 
    ' (starting multiple asynchronous copy will not work as it causes error messages, an invalid ZIP file, ...)
    while (targetFolderObj.ParseName(item.Name) is nothing)
      WScript.Sleep 1
    wend
  end If
next

set targetFolderObj = nothing
set sourceFolderObj = nothing
set app = nothing

0

Here'a内蔵要約する能力の窓圧縮と解凍のためにしようとする私の- https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -with-batch-f

ほとんどすべてのWindowsマシンで動作するはずのいくつかのソリューションがあります。


あなたの答えを広げてください-それはいつでも死ぬかもしれないリンクに非常に重く依存しています。
studiohack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.