作为参数传递时,批处理回显字符串被限制
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
我运行 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