【问题标题】:Trouble in Batch using quotes in a variable在变量中使用引号的批处理问题
【发布时间】:2014-10-06 08:02:20
【问题描述】:

这里的批处理脚本相对较新,我一直在到处寻找答案,但什么也没找到。

到目前为止,这是我所拥有的批处理脚本..

@echo off

set addtext="text to add includes spaces"

for /f "delims=" %%l in (file.txt) do (
    echo %%l %addtext% >> tmpfile.txt
)

我希望在文件的每一行中添加一行文本,但我的问题在于双引号。我不希望引号与文本一起显示。
我在那里只有引号,因为我希望添加到每一行的文本字符串中有空格。

【问题讨论】:

    标签: batch-file quotes


    【解决方案1】:
    @echo off
        setlocal enableextensions disabledelayedexpansion
        set "addtext=text to add includes spaces"
    
        for /f "delims=" %%l in (file.txt) do (
            >> tmpfile.txt echo %%l %addtext%
        )
    

    这应该可行。只是不要在变量的值中包含引号,而是使用它们来包装赋值。

    如果字符串可能包含更多有问题的字符,这是一个更安全的版本

    @echo off
        setlocal enableextensions disabledelayedexpansion
        set "addtext=text to add includes spaces, > redirections & more problems !"
    
        (for %%a in ("%addtext%") do for /f "delims=" %%l in (file.txt) do (
            echo %%l %%~a
        )) >> tmpfile.txt 
    
    1. 引号不包含在值中,但包含赋值
    2. 为防止访问变量时出现问题,它用引号括起来,存储在 for 可替换参数 (%%a) 中,并在请求时不带引号回显 (%%~a)
    3. 只是为了获得更好的性能(也应该在第一个代码中使用)而不是打开/写入/关闭每一行的输出文件(每个echo 的重定向),重定向是针对完整的for 命令处理的.

    【讨论】:

    • @jeb,我已经复制并粘贴了答案中的代码(延迟扩展禁用)并且它可以工作。为了使它像您指出的那样工作,需要在变量定义上转义感叹号,这是我不想做的。并且,启用延迟扩展后,如果源文件在其数据中包含!,则输出将是错误的。
    • 你说得对,我读了enabledelayedexpansion,但你写了enableextension ...
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2013-07-16
    相关资源
    最近更新 更多