icacls разбиты в скобках

Это на самом деле работает, но не в том формате, который я предпочитаю. Код ниже добьется того, чего я хочу. Создает папку в любом доступном для записи стандартном профиле пользователя (я знаю, что он не будет работать в некоторых системных профилях, таких как "По умолчанию" и т. Д.), В котором нуждается некоторое программное обеспечение, а также дает ему соответствующие разрешения.

for /d %%A in ("C:\Users\*") do mkdir "%%~fA\AppData\Local\Folder1" 
for /d %%A in ("C:\Users\*") do mkdir "%%~fA\AppData\Local\Folder1_Ltd"
for /d %%A in ("C:\Users\*") do icacls "%%~fA\AppData\Local\Folder1" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e
for /d %%A in ("C:\Users\*") do icacls "%%~fA\AppData\Local\Folder1_Ltd" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e

Это кажется немного чрезмерным, хотя. Я хочу просто сделать один цикл для пользовательских папок, а затем использовать скобки для вывода списка команд, сохраняя пользовательский цикл для каждой функции. Однако, когда я пробую ниже, он даже не делает папки. Если я отлаживаю с помощью командной строки, то останавливается на "все" было неожиданно в это время. Я не уверен, почему? Любой совет приветствуется, спасибо.

for /d %%A in ("C:\Users\*") do (
mkdir "%%~fA\AppData\Local\Folder1" 
mkdir "%%~fA\AppData\Local\Folder1_Ltd"
icacls "%%~fA\AppData\Local\Folder1" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e
icacls "%%~fA\AppData\Local\Folder1_Ltd" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e
)
pause

3 ответа

Решение

Вы также можете использовать WMI для доступа только к профилям обычных пользователей:

@Echo Off
For /F "Skip=1 Delims=" %%A In (
    '"WMIc Path Win32_UserProfile Where (Special!='True') Get LocalPath"'
    ) Do For /F "Delims=" %%B In ("%%A") Do Call :Sub %%B
Pause>Nul
GoTo :EOF

:Sub
For %%A In (Folder1 Folder1_Ltd) Do (If Not Exist "%*\AppData\Local\%%A\" (
        MD "%*\AppData\Local\%%A")
    ICACLS "%*\AppData\Local\%%A" /T /C /Q /grant:r Everyone:(OI^)(CI^)F /inheritance:e)

Вы должны экранировать все закрывающие скобки внутри (блок кода), чтобы они не интерпретировались как конец блока.

for /d %%A in ("C:\Users\*") do (
    mkdir "%%~fA\AppData\Local\Folder1" 
    mkdir "%%~fA\AppData\Local\Folder1_Ltd"
    icacls "%%~fA\AppData\Local\Folder1" /T /C /grant(:r^) "Everyone":(OI^)(CI^)(F^) /inheritance:e
    icacls "%%~fA\AppData\Local\Folder1_Ltd" /T /C /grant(:r^) "Everyone":(OI^)(CI^)(F^) /inheritance:e
)
pause

Отредактируйте как eryksun, предложив использовать подпрограмму, как альтернативу (хотя используя редактор для вставки ^ убегает не страшно)

@Echo off
for /d %%A in ("C:\Users\*") do Call :Sub "%%~fA"
pause
Goto :Eof
:Sub
mkdir "%~f1\AppData\Local\Folder1" 
mkdir "%~f1\AppData\Local\Folder1_Ltd"
icacls "%~f1\AppData\Local\Folder1" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e
icacls "%~f1\AppData\Local\Folder1_Ltd" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e

Другой альтернативой может быть удаление ненужных скобок и цитирование необходимых

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /d %%A in ("C:\Users\*") do (
        for %%F in ("%%~fA\AppData\Local\Folder1" "%%~fA\AppData\Local\Folder1_Ltd") do (
            mkdir "%%~fF"
            icacls "%%~fF" /T /C /grant:r "Everyone":"(OI)(CI)(F)" /inheritance:e
        )
    )

Если вы хотите сохранить скобки в grant переключиться, тогда вы можете

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /d %%A in ("C:\Users\*") do (
        for %%F in ("%%~fA\AppData\Local\Folder1" "%%~fA\AppData\Local\Folder1_Ltd") do (
            mkdir "%%~fF"
            icacls "%%~fF" /T /C "/grant(:r)" "Everyone":"(OI)(CI)(F)" /inheritance:e
        )
    )

примечание: оба случая проверены на Windows 10. Я не могу проверить в данный момент, если icacls умение иметь дело с приведенными аргументами (в /grant case) присутствует в предыдущих версиях ОС.

Примечание 2: протестировано без проблем (ну, /inheritance коммутатор не существовал) с версией Windows 2003 server SP2 icacls.exe (первая версия опубликована). Как указал eryksun, дополнительные цитаты удаляются CRT.

Другие вопросы по тегам