批处理中读取包含特殊字符的文件

3
我该如何在批处理中读取和解析包含特殊字符的文件?我有一个名为test.txt的文本文件,其中只有foo!!!bar,还有一个包含以下内容的批处理文件:
@echo off
setlocal enabledelayedexpansion enableextensions

FOR /F "tokens=* delims=" %%a IN (.\test.txt) DO (
    echo Unquoted is %%a
    echo Quoted is "%%a"
    set "myVar=%%a"
    echo myVar is still !myVar! or "!myVar!"
)
exit /b 0

我希望并期望它以某种方式输出foo!!!bar,但实际输出结果为:
Unquoted is foobar
Quoted is "foobar"
myVar is still foobar or "foobar"

当然我可以直接使用type test.txt,但我想处理文件的每一行。
1个回答

5
你的问题是批处理器及其阶段的副作用。
FOR参数在延迟展开阶段之前被展开。但是当%%a为foo!!bar时,延迟展开会删除感叹号,因为!!不是有效的变量展开符号。
你需要切换延迟展开,因为只有在禁用延迟展开时,才能安全地展开%%a。
@echo off
setlocal DisableDelayedExpansion enableextensions

FOR /F "tokens=* delims=" %%a IN (.\test.txt) DO (
    echo Unquoted is %%a
    echo Quoted is "%%a"
    set "myVar=%%a"

    setlocal enabledelayedexpansion 
    echo myVar is still !myVar! or "!myVar!"
    endlocal
)

您也可以查看CMD.EXE如何解析脚本

在我的情况下,在将内容写入文件之前,我使用了相同的切换,但是出现了错误,请帮助我。 - CIPHER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接