2015-02-12 49 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

相关问题