我一直在翻譯一些shell代碼到MS-DOS批處理。在我的代碼中,我有樣本:批For循環:使用通配符字符串
for %%i in (%*) do set "clargs=!clargs! %%i"
如果我輸入參數「 - ?」 (不帶引號),它不會添加到clargs中。我認爲這是因爲'?'是通配符。有什麼我可以做的,以確保因爲問號位於參數中而不做特別的事情嗎?
我一直在翻譯一些shell代碼到MS-DOS批處理。在我的代碼中,我有樣本:批For循環:使用通配符字符串
for %%i in (%*) do set "clargs=!clargs! %%i"
如果我輸入參數「 - ?」 (不帶引號),它不會添加到clargs中。我認爲這是因爲'?'是通配符。有什麼我可以做的,以確保因爲問號位於參數中而不做特別的事情嗎?
您是對的,通配符*
和?
在FOR IN()子句中使用時總是被展開。不幸的是,沒有辦法阻止通配符擴展。
不能使用一個for循環來訪問所有的參數,如果它們包含通配符。相反,您應該使用GOTO循環以及SHIFT命令。
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 file optional argument parsing。
@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 ...)
我同意這是非常愚蠢的 - 我想有更好的樣本替換它,但它是爲了顯示我的意思最好的線路。實際的代碼示例現在大約20行,我不覺得有必要展示我的意思。我會明天嘗試這個樣本,如果它能夠工作,我會將你的答案標記爲正確的。謝謝! – Sammidysam
所以我http://pastebin.com/bDABiTy6和它的作品,但我將如何通過args來值環以類似的方式,爲ARGS可能含有「 - ?」然後for循環解釋參數會忽略它。 – Sammidysam
@Sammidysam - 咦?你指的是什麼FOR循環?我的答案中沒有FOR循環,PasteBinding代碼中也沒有FOR循環。 – dbenham