Я перемещаю пользователей в новый домен, файловый сервер и формат имени пользователя. Я пытаюсь написать простой пакет DOS для копирования данных и установки разрешений. X: сопоставлен со старым сервером, а E: является локальным диском на новом сервере. Входной файл - это просто CSV-список OldUserName, NewUserName. Файл CSV - State.users.csv. (Пакет разделяет состояние для использования в пути на новом сервере).
Пакетный файл:
SETLOCAL EnableDelayedExpansion
FOR /F "delims=. tokens=1" %%a in ("%1") DO SET Site=%%a
FOR /F "delims=, tokens=1-2" %%c in (%1) do (
ROBOCOPY X:\Users\%%c E:\%Site%\User\%%d /E /Z
ICACLS "E:\%Site%\User\%%d" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
ICACLS "E:\%Site%\User\%%d" /grant "SYSTEM":(OI)(CI)F
ICACLS "E:\%Site%\User\%%d" /grant "CREATER OWNER":(OI)(CI)F
ICACLS "E:\%Site%\User\%%d" /grant "%%d":(OI)(CI)F
IF NOT "%2"=="" RENAME X:\Users\%%c ZZZ-%%c
)
ENDLOCAL
При запуске команда icacls умирает с:
(CI)F was unexpected at this time.
ICACLS "E:\Ohio\User\%d" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
и никогда даже не запускает робокопию ...? (Со всеми закомментированными icacls, robocopy работает нормально.)
Тем не менее, строки, которые я удалил во время тестирования, перекликаются с правильно замененными переменными:
(
rem ROBOCOPY X:\Users\MDuffy E:\Ohio\User\Steve.Hrsk /E /Z
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "Domain Admins":(OI)(CI)F /Inheritance:r
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "SYSTEM":(OI)(CI)F
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "CREATER OWNER":(OI)(CI)F
rem ICACLS "E:\Ohio\User\Steve.Hrsk" /grant "Steve.Hrsk":(OI)(CI)F
IF NOT "" == "" RENAME X:\Users\MDuffy ZZZ-MDuffy
)
Я могу скопировать и вставить эти строки (за исключением REM, конечно) в командной строке, и icacls работает должным образом.
Я пробовал одинарные кавычки, одинарные кавычки вокруг двойных кавычек. Я добавил кавычки к команде robocopy, и она отлично работает (с одинарными или двойными).
Ради здравого смысла я удалил (CI), а затем он умирает на F для Full.
Я пробовал с EnableDelayedExpansion и без него, не повезло.
Я также удалил первый FOR / F. Те же результаты.
Вместо REM я использовал ECHO и ВСЕ ЕЩЕ получаю сообщение об ошибке «(CI) F было неожиданным ...» !!
Я скопировал и вставил в новый файл, попробовал закодировать его как ANSI и UTF-8, просмотрел все скрытые символы (нашел TAB между ICACLS и «E: ...» на первом, но заменил его пробелом. не помогло). [Я использую Блокнот ++]
Я вставил его в новый файл, сохранил как текстовый файл с кодировкой UTF-8, а затем переименовал его в .bat из строки cmd ....
Я не знаю, почему расширение переменных отлично работает для Robocopy, но не для Icacls (когда оно не отключено).
Что мне здесь не хватает?
Я обнаружил, что мне нужно добавить cmd /c
к началу icacls
команда.
Мой командный файл выглядит так:
for /f "tokens=*" %%i in (%1) do (
cmd /c "icacls.exe F:\home\%%i /grant %%i:(oi)(ci)(m)"
)
)
У меня это отлично работает.
Использовать это: https://stackoverflow.com/a/6478753
for /f "tokens=*" %%i in (%1) do (
icacls.exe "F:\home\%%i" /grant "%%i:(oi)(ci)(m)"
)
)
Используйте другой набор переменных для копирования и другие для ICACLS. Robocopy не был MS пару лет назад, и ICACLS использует другие переменные - вам просто нужен другой if. Вы также можете использовать оболочку Power для обертывания переменных ICACLS, что упрощает все http://tomandersonpro.net/ntfs-permissions-with-powershell/ .