2013-12-16 89 views
1

我發現批處理腳本的一個奇怪問題,我似乎無法解釋。也許它只是因爲我不知道有足夠的瞭解批次如何工作的基礎,但這裏有一個例子批處理文件(test.bat的):這是Windows批處理中的錯誤嗎?

@echo off 

FOR /F "tokens=1*" %%i in ("%*") DO (
    echo %%j 
) 

,如果我把它像這樣:

test.bat ab a,b "a,b" 

我得到這個作爲我的輸出:

a,b "a b" 

爲什麼第二個逗號被剝離?如果我逃跑,像這樣的逗號:

test.bat ab a,b "a^,b" 

我得到正確的輸出:

a,b "a,b" 

這幾乎就像「」被認爲是一個分隔符的for循環,但是當我看到FOR/?,唯一的默認delim是空白。逗號不作爲分隔符列出。如果我明確指出delim是一個空格,我仍然會得到這種行爲。如果我逃避報價,我仍然會得到這種行爲。無論如何,如果逗號是一個分隔符,第一個逗號也應該被剝離出來嗎?奇怪的是,如果你嘗試在for循環中使用'usebackq',你會得到完全相反的結果。第一個逗號剝離出來,第二個被保留:

a b "a,b" 

爲什麼我必須逃脫,引號裏的所有逗號這個工作?是否有一些whindows規則我失蹤或者它只是Windows批處理腳本中的錯誤?

+0

您的代碼給出錯誤C:\ Temp> test.bat ab a,b「a,b」 a,b「a b」 系統找不到文件ê♠。 –

回答

0
  1. 逗號是在命令行的隔板Reading second argument in batch file if first argument has commas
  2. 當調用FOR /F "tokens=1*" %%i in ("%*"),擴大時,在成爲

    FOR/F 「令牌= 1 *」 %% I(「AB一個, b「a,b」「) 現在你看到你有雙引號打開和關閉2次。 希望這有助於。

  3. 我的建議是,如果喲需要複雜的命令行參數解析使用
:loop 
rem you code here 
shift 
goto :loop 

有使用與%時是有一些限制*。

+0

那麼,爲什麼兩個內部報價打印?如果它真的認爲它是兩個引號,如'ab a,b'a'和'b「」',爲什麼只有兩個引號會回顯?它仍然使用空格作爲分隔符。注意''ab'不是打印出來而不是'ab a,b「a' – user972276

+0

這就是爲什麼我在答案中提到了第3點,它仍然有一些奇怪的東西,如果你想深入瞭解 - 你可以做一些搜索但如果你想製作一個腳本 - 你需要一個解決方法。 –

+0

是的,我可以做一個解決方法,但我只是想知道是否有人知道爲什麼批處理的方式。這個問題與%*無關。我可以創建一個變量並使用它來代替%*。因此,使用%*的循環限制在這裏不適用。逗號不是FOR循環的默認分隔符。我在網上看了一下,但沒有發現任何內容。 – user972276

0
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "line=a b a,b "a,b"" 
SET line 
ECHO [%*] 
FOR /f "tokens=1*" %%i IN ("%*") DO (ECHO %%j) 
FOR /f "tokens=1*" %%i IN ("%line%") DO (ECHO %%j) 
FOR /f "tokens=1*" %%i IN ("!line!") DO (ECHO %%j) 
FOR /f "tokens=1*" %%i IN ('echo %line%') DO (ECHO %%j) 

GOTO :EOF 

運行以上可能會指向一個解釋。這完全是一個歷史問題 - 相當於進行替換時 - %var%首先,%% x秒和!var!第三。

+0

我仍然不明白爲什麼逗號被刪除。什麼是刪除它,爲什麼?我沒有得到什麼替代順序與逗號掉落有關。顯然'!line!'被取代與'%line%'不同,但是爲什麼? – user972276