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

escape double quotes in a variable when using echo|set /p=

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=.

时是否可以转义变量中的双引号

我们需要向 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 模拟 return 按键以终止 set/p 提示,但它会为管道的每一侧创建单独的 cmd 实例,使其变慢。 <nul 输入重定向足以获得相同的结果,但速度更快且资源使用更少。

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已经提到)