【问题标题】:Batch file IF statement fails with "was unexpected at this time"批处理文件 IF 语句失败并显示“此时意外”
【发布时间】:2011-06-25 15:09:54
【问题描述】:

我有一个执行以下操作的批处理文件:

@IF EXIST "C:\Program Files\MyAppFolder" (
  icacls "C:\Program Files\MyAppFolder" /inheritance:r
  icacls "C:\Program Files\MyAppFolder" /GRANT SYSTEM:(CI)(OI)(F)
  icacls "C:\Program Files\MyAppFolder" /GRANT Administrators:(CI)(OI)(F)
)

单独的命令工作正常,但像这样放在IF 语句中我收到此错误,脚本停止运行:

(OI)(F) 在这个时候出乎意料。

如果我在 IF 语句中只有一个命令,那么它可以正常工作。

我猜你只能在 IF 括号之间使用一个语句?

这发生在 Windows 2008 和 Windows 2003 (with the ICACLS hotfix) 上。

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    shell 似乎认为命令第三行中的) 是第一行中打开的右括号。您需要引用包含括号的参数:

    @IF EXIST "C:\Program Files\MyAppFolder" (
      icacls "C:\Program Files\MyAppFolder" /inheritance:r
      icacls "C:\Program Files\MyAppFolder" /GRANT "SYSTEM:(CI)(OI)(F)"
      icacls "C:\Program Files\MyAppFolder" /GRANT "Administrators:(CI)(OI)(F)"
    )
    

    【讨论】:

    • 该死的明显,我应该更清楚:) 谢谢。
    • 现在是 2017 年,像我这样的人仍然需要这个.. 这绝对不明显!!
    【解决方案2】:

    如果您需要将权限分配给名称中带有空格的用户(例如:“CREATOR OWNER”),则上述答案将不起作用

    更好的解决方案是使用带有调用的函数:

    @ECHO OFF
    
    IF EXIST "C:\Program Files\MyAppFolder" (
       CALL:Permissions
    )
    
    GOTO:eof
    
    :Permissions
       icacls "C:\Program Files\MyAppFolder" /inheritance:r
       icacls "C:\Program Files\MyAppFolder" /GRANT SYSTEM:(CI)(OI)(F)
       icacls "C:\Program Files\MyAppFolder" /GRANT Administrators:(CI)(OI)(F)
       GOTO:eof
    

    函数末尾需要 GOTO:eof。

    批处理函数的详细信息可以找到here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 2017-08-01
      • 2021-06-23
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多