批处理:从包含冒号和感叹号的文件中读取一行

Batch: Reading in a line from a file that has a colon and exclamation

我正在尝试从包含冒号和感叹号的文件中读取一行。当我回显该行时,它只显示冒号后的所有内容。我需要保留 enabledelayedexpansion 以获得我将在 do 循环中执行的更高级代码。但现在我只想正确回应。 如有任何帮助,我们将不胜感激!

文件会这样写:

! 12345 APX: 6.32

我试过的代码是:

setlocal EnableDelayedExpansion
cd C:\Users\jwagh\Desktop\
for /f "usebackq delims=" %%a in (test.txt) DO (
setlocal DisableDelayedExpansion
 echo %%a
 set line=%%a
 set example=%line:~0,-1%
 echo %example%
)

可能禁用 delayedexpansion 是唯一可行的解​​决方案,但根据您的数据,将 delims 设置为 ! 会将 %%a 设置为整行,减去初始的 [=12] =](假设显然只有一个 !-已知长度的序列,并且它总是领先于行)

for /f "usebackq delims=!" %%a in (%FamilyFile%) DO echo ^^!%%a

唯一的防弹解决方案是在 %%a 扩展期间禁用 delayed expansion,并仅在实际需要时才启用它。例如,像这样:

setlocal DisableDelayedExpansion
for /F "usebackq delims=" %%a in (%File%) do (
    set "Item=%%a"
    setlocal EnableDelayedExpansion
    echo(!Item:,-1!
    endlocal
)

由于 setlocal/endlocal 块创建的本地化环境在嵌套方面受到限制,因此您还需要将 endlocal 放入循环中。考虑到 endlocal 之后,自最近 setlocal 以来的所有环境变化都丢失了。


但现在完全不同的东西(与问题的revision 3相关):
由于 usebackq 选项,我假设 %File% 持有一个引用文件 path/name。
我建议不要在变量值中包含引号,使用以下语法:

set "File=D:\Data\file.ext"  & rem // (particularly note the position of the opening quote)

参考 了解为什么这样更好。