2015-02-12 65 views
2

我在csv文件上運行下面的批處理腳本。批處理回顯字符串在作爲參數傳遞時被限制

@echo off 
set "filename=test.csv" 
for /f "USEBACKQtokens=*" %%A in ("%filename%") do (
    call :myecho "%%A" 
) 
pause 

:myecho 
    echo %1 
GOTO :eof 

在CSV文件中典型的線路是這樣的:

Text and some more 2/11/2015,A234,Mr. Example Guy,18217.01,"$20,729.89","$4,111.06","$4,453.08" 

回聲實際上將導致以下的輸出:

Text and some more 2/11/2015,A234,Mr. Example Guy,18217.01,"$20, 

不知怎的,它切斷的逗號,之後的第一個引號。我不明白爲什麼。有人可以解釋,並告訴我如何在那裏打印整條生產線?請注意,如果我直接在for循環中打印,它會打印整行。

回答

3

下面的行

call :myecho "%%A" 

膨脹以

call :myecho "Text and some more 2/11/2015,A234,Mr. Example Guy,18217.01,"$20,729.89","$4,111.06","$4,453.08"" 

參數來調用的子程序通過任何<space>,;<tab>=,或<0x255>被分隔。引號內的分隔符將被忽略。 $20,729.89中的逗號用原始CSV引用,但它們在您的CALL中未引用,因爲您添加了自己的附加引號。因此,參數%1以美元金額的第一個未加引號的逗號結尾。

如果要將包含引號和分隔符的字符串傳遞給子例程,則應通過環境變量通過引用傳遞它們。您應該使用延遲擴展來擴展變量,以便保護所有字符。但是,在FOR循環中應該關閉延遲擴展,以便在擴展FOR循環變量時!值不會損壞。

@echo off 
setlocal disableDelayedExpansion 
set "filename=test.csv" 
for /f "USEBACKQtokens=*" %%A in ("%filename%") do (
    set "var=%%A" 
    call :myecho var 
) 
pause 
exit /b 

:myecho 
setlocal enableDelayedExpansion 
echo !%1! 
exit /b 
+0

太棒了。感謝您的解釋和解決方案! – 2015-02-12 06:22:32

相關問題