1

私はビデオ変換バッチを作成しました。ユーザーは自分のビデオを任意のディスクまたはパーティションからバッチにドラッグアンドドロップするだけで、変換されたビデオは特定のディスクの特定の場所に保存されます。

コードは次のようになります

@echo off
%~d0
cd %~p0
for %%f in (%*) do ...
pause

実際の問題はにあります(%*)
ファイルの名前に閉じ括弧が含まれていると、バッチは機能しません。これを修正するために、を使用("%*")しましたが、名前にスペースが含まれているファイルや複数のファイルでは機能しません。
私も試してみまし(%~*)たが、それは無効です。

いくつかの調査の結果、名前file(test)とが付いた複数のファイルをバッチにドロップするとfile test、次のように%*解決されることに気付きました。

file(test) "file test"

これは、ファイル名に引用符が含まれる場合と含まれない場合があることを意味します。

私の質問は:これにどう対処するか?理想的には、解決し
たいと思います(両方の名前が引用符で囲まれています)%*"file(test)" "file test"

4

1 に答える 1

5

ループを使用する代わりにfor、一度に 1 つずつ、各パラメーターでサブルーチンを呼び出すことができます。

:nextArgument
set arg=%~1
if not defined arg goto :eof
call :processFile "%arg%"
shift
goto nextArgument

:processFile
set file=%~1
echo "%file%"
:: do your processing here
goto :eof

これにより、スペースで区切られた各引数 (ただし、引用符にはスペースを含めることができます) が一度に 1 つずつ処理され、それらが processFile ルーチンに渡されます。最初に%~1引数から引用符を削除してから、processFile を呼び出すときに引用符を追加し直していました。そうすれば、processFile に到達したときに、すべてが引用符で囲まれていることがわかります。

于 2013-03-11T19:21:53.503 に答える