2013-05-26 71 views
1

我一直在翻譯一些shell代碼到MS-DOS批處理。在我的代碼中,我有樣本:批For循環:使用通配符字符串

for %%i in (%*) do set "clargs=!clargs! %%i" 

如果我輸入參數「 - ?」 (不帶引號),它不會添加到clargs中。我認爲這是因爲'?'是通配符。有什麼我可以做的,以確保因爲問號位於參數中而不做特別的事情嗎?

回答

2

您是對的,通配符*?在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

+0

我同意這是非常愚蠢的 - 我想有更好的樣本替換它,但它是爲了顯示我的意思最好的線路。實際的代碼示例現在大約20行,我不覺得有必要展示我的意思。我會明天嘗試這個樣本,如果它能夠工作,我會將你的答案標記爲正確的。謝謝! – Sammidysam

+0

所以我http://pastebin.com/bDABiTy6和它的作品,但我將如何通過args來值環以類似的方式,爲ARGS可能含有「 - ?」然後for循環解釋參數會忽略它。 – Sammidysam

+0

@Sammidysam - 咦?你指的是什麼FOR循環?我的答案中沒有FOR循環,PasteBinding代碼中也沒有FOR循環。 – dbenham

0
@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 ...)