Оператор пакетного файла 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).
Ответы
Ответ 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 требуется в конце функции.
Подробную информацию о функциях в пакете можно найти здесь.