批处理文件IF语句失败,“此时意外”

时间:2011-06-25 15:09:55

标签: batch-file

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

@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) was unexpected at this time.

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

我猜你只允许IF括号之间的一个陈述?

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

2 个答案:

答案 0 :(得分:26)

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)"
)

答案 1 :(得分:0)

如果您需要为名称中有空格的用户分配权限,上述答案将无效(EG:" 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