Csv 当作为参数传递时,批处理回显字符串将被封顶

Csv 当作为参数传递时,批处理回显字符串将被封顶,csv,batch-file,for-loop,argument-passing,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,7

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

下一行

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""
被调用的子例程的参数由
中的任何一个分隔
=
。引号内的分隔符将被忽略。
$20729.89
中的逗号在原始CSV中被引用,但在您的通话中没有被引用,因为您添加了自己的引号。因此,参数
%1
以美元金额中第一个不带引号的逗号结尾

如果要将包含引号和分隔符的字符串传递给子例程,则应通过环境变量通过引用传递它们。您应该使用延迟扩展来扩展变量,以便保护所有字符。但是延迟扩展应该在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

令人惊叹的。感谢您的解释和解决方案!