作为参数传递时,批处理回显字符串被限制

时间:2015-02-12 05:14:15

标签: csv batch-file for-loop argument-passing

我在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循环中打印,则会打印整行。

1 个答案:

答案 0 :(得分: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""

CALLed子例程的参数由<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