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

Batch echo string is capped when passed as argument

我运行 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,",729.89",",111.06",",453.08"

echo 实际上会产生以下输出:

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

它以某种方式在第一个引号之后的逗号处被截断。我不明白为什么。有人可以解释一下,并告诉我如何在那里打印整行吗?请注意,如果我直接在 for 循环中打印,它会打印整行。

下面一行

call :myecho "%%A"

扩展为

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

CALLed 子程序的参数由 <space>,;<tab>=<0x255> 中的任何一个分隔.引号内的分隔符将被忽略。 ,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