2016-07-16 6 views
2

バッチスクリプトを実行しているので、特定のフォルダ内の複数のディレクトリを圧縮できます。7z C以外のドライブでスクリプトを実行すると「不正なコマンドライン」

フォルダがC:\ somethingの場合は問題なく動作しますが、E:\何かのフォルダに同じフォルダを作成しようとするとエラーが発生します。それは、通常、どのように動作するかの

@ECHO OFF 
if %1.==. (
    SET "rootpath=%cd%" 
) else (
    SET "rootpath=%~1" 
) 
FOR /D %%D IN ("%rootpath%\*") DO (
    7za a -t7z %%D.7z %%D\* -mx9 
) 

例:それが失敗したかの

C:\Users\Me\Desktop\ExampleFolder>script 
7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 
Scanning 
Creating archive C:\Users\Me\Desktop\ExampleFolder\D1.7z 
Everything is Ok 
7-Zip (A) 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18 
Scanning 
Creating archive C:\Users\Me\Desktop\ExampleFolder\D2.7z 
Everything is Ok 

例:

C:\Users\Me\ExampleFolder>script "E:\Documents\ExampleFolder" 
Error: 
Incorrect command line 
Error: 
Incorrect command line 

もちろん、私もしてみました

スクリプトはこれです同じフォルダ内のスクリプトを実行し、場所として引数を渡すと動作することを確認しました。ありがとう。

+0

印刷 '%%あなたのループにおけるD 'と、 – leetibbett

答えて

1

バッチコード内の2つの間違いがあります。

rootpathに割り当てられたパスがバックスラッシュで終わっていないことを確認していない場合は、%%Dに2つの連続するバックスラッシュを含むパスが含まれています。

このコーディング省略ミスによるパス内の連続する2つのバックスラッシュは、バッチを呼び出す際のパラメータ文字列によって決まります。つまり、この場合は%cd%がドライブ文字aコロンとバックスラッシュです。 %cd%は、現在のディレクトリがドライブのルートディレクトリでない場合、末尾にバックスラッシュのないパスに展開されます。しかし、この間違いは重要ではありません。

秒1はスペースまたはこれらの文字のいずれかのような重要な文字を含むディレクトリのパスを使用しての本当の問題である:&()[]{}^=;!'+,`~

%%D.7z%%D\*はのためのパラメータのリストを作り、二重引用符で囲まれていません7za.exeは、特に1つ以上のパスのスペースで無効です。

私はそれをどのように見つけましたか?

の左にコマンドechoを挿入して、ループ内で実行される内容を確認しました。私は7-Zipをインストールしていないので、バッチファイルをテストするためにechoが必要でした。

ソリューション:

@echo off 
if "%~1" == "" (
    set "RootPath=%CD%" 
) else (
    set "RootPath=%~1" 
) 
if "%RootPath:~-1%" == "\" set "RootPath=%RootPath:~0,-1%" 

for /D %%D in ("%RootPath%\*") do (
    7za.exe a -t7z "%%D.7z" "%%D\*" -mx9 
) 

このバッチファイルが7za.exeへのパスが知られている、常に同じコンピュータ上で実行されている場合は、バッチファイルで二重引用符で囲まれた完全なパスで7za.exeを指定することが良いでしょう。

使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。

  • cmd /? ...少なくとも最後の出力ヘルプページの最後の段落を読んでください。
  • echo /?
  • for /?
  • if /?
  • set /?
+0

ありがとう!私はバッチを学んでいて、あなたの答えは問題を解決しただけでなく、私に多くのことを理解させました。 – kirchhoff

1

は、このバッチファイルのために試してみて:

@echo off 
set rootpath=c:\test 
set strProgramFiles=%ProgramFiles% 
if exist "%ProgramFiles(x86)%" set strProgramFiles=%ProgramFiles(x86)% 
Set Path7z="%strProgramFiles%\7-zip\7z.exe" 
echo %Path7z% 
pause 
CD /D "%rootpath%" 
FOR /D %%D IN ("%rootpath%\*") DO (
    %Path7z% a -t7z %%D.7z %%D\* -mx9 
) 
pause 
+1

感謝をやろうとしているものを参照、これは私が持っていたものと少し異なっていますとにかく試してみましょう。 – kirchhoff

関連する問題