batch-file - 在批处理中读取具有特殊字符的文件

标签 batch-file for-loop io special-characters

如何在 Batch 中读取和解析包含特殊字符的文件?我有一个名为 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,但我想处理文件的每一行。

最佳答案

您的问题是批处理解析器及其阶段的副作用。

FOR 参数在延迟扩展阶段扩展之前扩展。
但是当 %%afoo!!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
)

您还可以查看 How does the CMD.EXE parse...

关于batch-file - 在批处理中读取具有特殊字符的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964923/

相关文章:

ruby - 将 radix-2 数字字符串数组写入 Ruby 中的二进制文件

java - 更改MapReduce(K,V)输出格式

windows - 定义这些批处理命令

c++ - 如何添加带有空格的路径作为 CreateProcess 批处理文件的参数?

javascript - For 循环不迭代每个语句

C++如何检查数组中的元素是否相等?

batch-file - 批处理文件输入验证整数

c# - C#中如何直接执行SQL查询?

python - 在数据框中使用 For 循环将字符串转换为时间

c# - 使用 async/await 和 Task.Run 时不显示特定异常