Подтвердить что ты не робот

Оператор пакетного файла IF с ошибкой "был неожиданным в это время"

У меня есть пакетный файл, который делает следующее:

@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, я получаю эту ошибку, а script останавливается на своих дорожках:

(OI)(F) was unexpected at this time.

Если у меня есть только одна команда в инструкции IF, тогда она отлично работает.

Я предполагаю, что вам разрешено только одно утверждение между скобкой IF?

Это происходит в Windows 2008 и Windows 2003 (с исправлением ICACLS).

4b9b3361

Ответ 1

Кажется, что оболочка считает, что ) в третьей строке вашей команды является закрывающей скобкой для той, которая открыта в первой строке. Вам нужно указать аргументы, содержащие круглые скобки:

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

Ответ 2

Вышеприведенный ответ не будет работать, если вам нужно назначить разрешения для пользователя с пробелом в имени (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 требуется в конце функции.

Подробную информацию о функциях в пакете можно найти здесь.