web-dev-qa-db-ja.com

バッチファイルを使用して個別のZipファイルとしてファイルをZipする

そのため、7Zipをバッチファイルで使用して、フォルダー内のファイルを取得し、個別のファイルとしてZip圧縮しようとしています。したがって、最初のファイルは独自のZipアーカイブであり、次のファイルも同様です。私はインターネットを見ていて、たくさんの異なるコードを試しました。これまでのところ、それらを単一のZipファイルとしてZip処理して、デスクトップに出力することに成功しました。

残念ながら、それを実行するコードを紛失しましたが、今は何もしないように見えます。

@echo on
cd "C:\Users\MVD21\Desktop\test"
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
pause

各ファイルに独自のZipアーカイブを持たせ、Zipアーカイブでファイル名を共有して、拡張子を除いたものにしたい。

どんな助けでも大歓迎です。

10
Mike Van Dunk

各ファイルに独自のZipアーカイブを持たせ、Zipアーカイブでファイル名を共有して、拡張子を除いたものにしたい

バッチスクリプト

(ソースと宛先の完全明示フォルダーパスを上に設定し、必要に応じて実行します。ソースは、Zipしたいファイルが存在する場所であり、宛先は、Zipしたい場所です。)

@ECHO ON

SET SourceDir=C:\folder\source
SET DestDir=C:\folder\destination

CD /D "C:\Program Files\7-Zip"
FOR /F "TOKENS=*" %%F IN ('DIR /B /A-D "%SourceDir%"') DO (
    7z.exe a "%DestDir%\%%~NF.Zip" "%SourceDir%\%%~NXF"
)
EXIT

コマンドライン

FOR /F "TOKENS=*" %F IN ('DIR /B /A-D "C:\Folder\Source"') DO 7z.exe a "C:\Folder\Dest\%~NF.Zip" "C:\Folder\Source\%~NXF"

その他のリソース

4
Pimp Juice IT

元のスクリプトは、行ごとに次のことを行います。

_@echo on_

コマンドプロンプトに、実行する前にバッチファイルの各コマンドを出力するように指示します。これは、実行前に実際に何が行われているかを「確認」できるようにするためです。

_cd "C:\Users\MVD21\Desktop\test"_

[〜#〜] c [〜#〜]がハングする[〜#〜] d [〜#〜] すべてのファイルをZipで圧縮したいパスに私が望むものへの方向性。

FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"

ここでのINのパラメーターは_(C:\Users\MVD21\Desktop\test)_です。これにより、ループ「本体」(キーワードDOの背後にあるアクション)が実行されます正確に1回、_%i_パラメータに値が割り当てられます_C:\Users\MVD21\Desktop\test_。これがあなたの望むことをしないのは当然のことです!これは、ディレクトリ全体を単一の.7zファイルに圧縮するように見えます。

何もしない場合は、_7z.exe_のパスが見つからないことが原因である可能性があります。そのファイルが現在のディレクトリ(上記のtestディレクトリ)にない場合は、PATH(_%PATH%_環境変数内)にある必要があります。シェルで_echo %PATH%_を使用して、現在何が設定されているかを確認します)。それ以外の場合は、_7z.exe_を現在のディレクトリにコピーするか、その場所への絶対パスを指定する必要があります(たとえば、_"C:\Program Files\7-Zip\7z.exe" ..._など)。

pause

スクリプトが終了すると、このキーワードは、コマンドプロンプトをすぐに終了するのではなく、Enterキーを押すかコマンドプロンプトを閉じるのを待つようにシェルに指示するだけです。


バッチスクリプト(または、実際にはコードを処理する他のすべてのもの)を構築しているときは、スクリプト全体を、理解していない(試みた)モノリシックコピー/ペーストとして扱うのをやめ、代わりに個別に理解できるサブパーツに問題を解決し、それらを一緒にフックします。これにより、他の誰かにすべての作業を依頼する代わりに、問題を個別に解決し、create解決策を実行できます。私はそれを強くお勧めします。

あなたの場合、あなたの問題の次のサブコンポーネントがあります:

  1. 特定のディレクトリに含まれる各ファイルを反復処理(ループスルー)します。
  2. 指定されたファイルごとに、_7z_ユーティリティを呼び出して、.7zファイルに入れます。

特定のニーズを解決する回答がすでに出ている可能性は、より一般的な部分を個別に見つけることができる可能性よりも低くなります。

この質問、「バッチスクリプトでディレクトリ内の各ファイルに何かを行う方法」 は問題の半分を解決します。

答えの要点は、StackOverflowの答えのこの部分から始めることです。

for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f

そして、何かをしている部分を変更します(_echo %%f_)あなたがやりたいことを行うように。スクリプトのtextを分析し、各文字とパラメーターの意味を理解したので、その部分を変更する必要があることはわかっています。自分のコードを挿入します。

ここにいくつかの「空気コード」があります(試されていない!):

for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"

上記の_@echo on_およびpauseステートメントは良い習慣なので、そのままにしておくことができます。ファイルが次の場所にある場合は、cdステートメントも保持することをお勧めします。そのパス。

それでは、何が残っているのでしょうか?

_@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause
_

「それが機能しない!」と返信した場合、私はあなたを助けません。これを試しても機能しない場合は、[〜#〜]必須[〜#〜]次の情報をコメントで教えてください:

  • これらのコマンドを実行するとき、またはバッチファイルに入れて実行するときに、コマンドプロンプトでどのexactエラーメッセージが表示されますか?省略しないでください。出力を直接コピーして貼り付けます(大量の場合は http://Pastebin.com に配置します)。
  • エラーメッセージは、問題があることを教えていると思います
  • 7-Zipインストールはどこにありますか(ファイルパス)?
  • 7-Zipインストールのファイルの場所は、PATH環境変数の内容に含まれていますか? (上記のように、cmdプロンプトで_echo %PATH%_を使用してこれを確認してください。)
4
allquixotic