【问题标题】:Batch: Reading in a line from a file that has a colon and exclamation批处理:从包含冒号和感叹号的文件中读取一行
【发布时间】:2016-12-29 21:55:23
【问题描述】:

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

文件会这样说:

! 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%
)

【问题讨论】:

  • %%a扩容过程中禁用延迟扩容,真正需要时才开启...
  • 我尝试在 do-loop 中重新启用它,但它不起作用。
  • “它不起作用”不是一个非常精确的描述,是吗?也许您应该发布更多代码,这样可能更容易为您提供帮助。一般来说,你需要考虑setlocal/endlocal的环境本地化,并且你需要知道这样的块的嵌套级别是有限的,因此当你有一个@987654326时你需要一个endlocal在循环中@那里...
  • 那是因为您需要在您的DODISabledelayedexpansion。
  • 不要使用评论中提供的建议来编辑您的问题。您最近的编辑不再给出您在文本中描述的症状。

标签: batch-file colon


【解决方案1】:

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

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

【讨论】:

  • 这就是我最终要做的。谢谢!
【解决方案2】:

唯一的防弹解决方案是在扩展%%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有关):
我假设 %File% 包含一个带引号的文件路径/名称,因为 usebackq 选项。
让我建议不要在变量值中包含引号,使用以下语法:

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

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

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 2017-05-14
    • 2012-10-15
    • 2023-02-14
    • 2019-12-07
    • 1970-01-01
    • 2023-02-21
    • 2017-06-11
    相关资源
    最近更新 更多