myt*_*lon 12 batch-file parentheses
在我的一个脚本中,我需要使用包含括号内部IF语句的变量,但是字符串缺少右括号或者脚本过早退出* was unexpected at this time(实际上不是星号),具体取决于场景.
例
@echo off
SET path=%programFiles(x86)%
echo Perfect output: %path%
IF NOT "%path%" ==  "" (
    REM Variable is defined
    echo Broken output:  %path%
)
pause >nul
产量
Perfect output: C:\Program Files (x86)
Broken output:  C:\Program Files (x86
我认为/知道这是因为它认为右括号C:\Program Files (x86)是IF语句的结尾并且它在echo完成之前退出.
是否有一种简单的方法可以解决这个问题?最好不要诉诸
IF语句,因为我需要在其中运行多行代码,GOTOs,因为它不实用,SETLOCAL EnableDelayedExpansion并且使用!path!而不是%path%,因为我记得在某处读取该方法不能在OS中一致地工作.如果没有,我很乐意接受所提供的最可靠的解决方案,无论它是什么.
(这个场景不值得讨论.这只是问题的一个精炼,集中的例子.结构需要像这样,因为它在我的实际脚本中,原因我不会进入.它除了这一点,它只会混淆事物并分散实际问题.)
首先 - 你永远不应该使用PATH变量供自己使用.它是一个保留的环境变量.将它用于您自己的目的可能会破坏您的脚本.
最简单的解决方案是使用延迟扩展.只要您的平台使用CMD.EXE,您就可以访问延迟扩展.
但是有一种相对简单的方法可以让它在没有延迟扩展的情况下运行.您可以使用消失的引号.在解析命令时,引用在解析时存在作为FOR变量的名称.它在执行时间之前扩展为空.
@echo off
SET mypath=%programFiles(x86)%
echo Perfect output: %mypath%
IF NOT "%mypath%" ==  "" (
  REM Variable is defined
  for %%^" in ("") do echo fixed output:  %%~"%mypath%%%~"
)
pause >nul
编辑 - 何时使用延迟扩展:回复评论
我通常只在需要时使用延迟扩展(或者更准确地说,当它是有利的时候).话虽这么说,我通常发现它在我的批处理代码的某些部分是有利的.
主要优势
echo !%1!echo !var:%search%=%replace%!,echo !var:%start%,%len%!.set "var=A&B" & echo !var!还有其他方法可以执行上述操作(除了最后一个),但延迟扩展是最简单,最有效(最快执行)和最可靠的选项.
主要缺点
!如果启用了延迟扩展,则在展开其值时,任何包含其值的FOR变量都将被破坏.我经常在FOR循环中打开和关闭延迟扩展以解决问题.