Пакетный файл IF оператор не удается с "было неожиданно в это время" - PullRequest
16 голосов
/ 25 июня 2011

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

@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 ( с исправлением ICACLS ).

Ответы [ 2 ]

26 голосов
/ 25 июня 2011

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

@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)"
)
0 голосов
/ 11 октября 2017

Приведенный выше ответ не сработает, если вам нужно назначить разрешения для пользователя с пробелом в имени (например, «СОБСТВЕННИК-СОЗДАТЕЛЬ»)

Лучшее решение - использовать функцию с вызовом:

@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 требуется в конце функции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...