【问题标题】:Batch echo string is capped when passed as argument作为参数传递时,批处理回显字符串被封顶
【发布时间】:2015-02-12 05:14:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    下面一行

    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
    

    【讨论】:

    • 太棒了。感谢您的解释和解决方案!
    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 2023-03-29
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多