使用echo | set / p =时,在变量中转义双引号

时间:2018-11-07 05:32:45

标签: windows batch-file echo double-quotes

echo|set /p=可以输出不带换行符的变量。

我正在尝试循环这样的文本文件

for /f %%a in (zen.txt) do (
    set var=%%a
    echo !var!
    echo|set /p=!var!
)

有些行只有一个",例如:

"he said...

echo正确输出上述行,而echo|set /p=不输出任何内容。

使用echo|set /p=时是否可以在变量中转义双引号。

2 个答案:

答案 0 :(得分:3)

我们将需要向set/p提供额外的报价以供使用。您可以尝试使用类似方法(当然无需创建测试文件)

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem TESTING - Create a input file
    >zen.txt (
        echo "He said...
        echo It was not me!
        echo It was "the thing"!
        echo ...
        echo ^& it was all"  ( The end )
    )

    for /f "delims=" %%a in (zen.txt) do (
        <nul set /p="%%a "
    )

echo|set /p模拟返回键的终止,以终止set/p提示,但是它为管道的每一侧创建了单独的cmd实例,使其变慢。 <nul输入重定向足以获得相同的结果,但速度更快且资源使用较少。

答案 1 :(得分:3)

set /p对于处理空格,引号和等号有点讨厌。

引号的开头或结尾必须加倍,但要显示引号时,表达式也应括在引号中。

要显示单引号,请使用

<nul set /p ="""

set /p似乎剥掉了外部引号的一遍。

您的代码可以更改为<NUL set /p="!var!",该代码应适用于普通文本以及引号。

如果文本以空格开头,则将其删除。 (但不是XP之前,set /p "= Hello"处显示空格)。

set /p似乎两次使用了引号删除器。 首先是扩展集语法
<nul set /p "=hello" Text after the last quote will be dropped

但对于内容,外部引号也将被删除 <nul set /p ="hello" Text after the last quote will be dropped

甚至将两者结合在一起
<nul set /p "="hello" Text after the last inner quote will be dropped "

注意:我使用<nul set /p,它的速度要快得多,因为echo | set /p版本使用管道并产生两个新的cmd.exe实例。 (已由MC ND提及)