いくつかのシェル コードを MS-DOS バッチに変換しています。私のコードには、サンプルがあります:
for %%i in (%*) do set "clargs=!clargs! %%i"
引数「-?」を入力すると (引用符なし)、clargs には追加されません。「?」が原因だと思います。ワイルドカード文字です。疑問符が引数にあるために for が特別なことをしないようにするためにできることはありますか?
いくつかのシェル コードを MS-DOS バッチに変換しています。私のコードには、サンプルがあります:
for %%i in (%*) do set "clargs=!clargs! %%i"
引数「-?」を入力すると (引用符なし)、clargs には追加されません。「?」が原因だと思います。ワイルドカード文字です。疑問符が引数にあるために for が特別なことをしないようにするためにできることはありますか?
そうです、ワイルドカード文字は、FOR IN() 句内で使用する*
と?
常に展開されます。残念ながら、ワイルドカードの展開を防ぐ方法はありません。
ワイルドカードが含まれている場合、FOR ループを使用してすべてのパラメーターにアクセスすることはできません。代わりに、SHIFT コマンドとともに GOTO ループを使用する必要があります。
set clargs=%1
:parmLoop
if "%~1" neq "" (
set clargs=%clargs% %1
shift /1
goto :parmLoop
)
あなたのサンプルは非常にばかげていますが、結果のclargs
変数には、既に%*
. すべての値を含む変数を設定するだけの場合は、単に使用しますset clargs=%*
より一般的には、引数変数の「配列」が作成されます。
set argCnt=0
:parmLoop
if "%~1" equ "" goto :parmsDone
set /a argCnt+=1
set arg%argCnt%=%1
shift /1
goto :parmLoop
:parmsDone
:: Working with the "array" of arguments is best done with delayed expansion
setlocal enableDelayedExpansion
for /l %%N in (1 1 %argCnt%) do echo arg%%N = !arg%%N!
Windows バッチ スクリプトに渡された UNIX スタイルの引数を処理する堅牢な方法については、Windows Bat ファイルのオプションの引数の解析に関するページを参照してください。
@ECHO OFF
SETLOCAL
SET dummy=%*
FOR /f "tokens=1*delims==" %%f IN ('set dummy') DO CALL :addme %%g
ECHO %clargs%
GOTO :eof
:addme
IF "%~1"=="" GOTO :EOF
IF DEFINED clargs SET clargs=%clargs% %1
IF NOT DEFINED clargs SET clargs=%1
SHIFT
GOTO addme
完全な防弾ソリューションが得られるとは思えません。上記のソリューションでは、たとえば、区切り文字 (コンマ、セミコロン、等号) が削除されます。他の解決策では、閉じ括弧に問題がある場合があります。パーペチュアル%
と^
問題があります-しかし、それは処理します-?
しかし、あなたの目的のために、あなたが示したことから、何が問題なのか
set clargs=%clargs% %*
(間違いなく、さらに処理したいと思うでしょうが、ve haff vays...)