我正在将用户移至新域、文件服务器和用户名格式。我正在尝试编写一个简单的 DOS 批处理来复制数据并设置权限。X: 映射到旧服务器,E: 是新服务器上的本地驱动器。输入文件只是 OldUserName、NewUserName 的 CSV 列表。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
甚至从未运行过 robocopy......?(将所有 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 处完全消失。
我尝试过使用和不使用 EnableDelayedExpansion,但没有成功。
我还删除了第一个 FOR /F。结果相同。
我使用了 ECHO 而不是 REM,但仍然收到错误“(CI)F 是意外的……”!!
我已将其复制并粘贴到新文件中,尝试将其编码为 ANSI 和 UTF-8,查看了所有隐藏字符(在第一个文件中,在 ICACLS 和“E:...”之间发现了一个 TAB,但用空格替换也没有用)。[我正在使用 Notepad++]
我将其粘贴到新文件中,将其保存为具有 UTF-8 编码的文本文件,然后从 cmd 行将其重命名为 .bat......
我不知道为什么变量扩展对于 Robocopy 有效而对于 Icacls 无效(当它没有被 REM 出来时)。
我在这里遗漏了什么?
答案1
我发现我需要添加cmd /c
到命令的开头icacls
。
我的批处理文件如下所示:
for /f "tokens=*" %%i in (%1) do (
cmd /c "icacls.exe F:\home\%%i /grant %%i:(oi)(ci)(m)"
)
)
这对我来说很好。
答案2
对 copy 使用不同的变量集,对 ICACLS 使用其他变量。Robocopy 几年前就不再是 MS 了,ICACLS 使用不同的变量 - 你只需要一个不同的 if。你也可以使用 power shell 包装 ICACLS 变量,这会让一切变得更容易一些http://tomandersonpro.net/ntfs-permissions-with-powershell/。
答案3
用这个:https://stackoverflow.com/a/6478753
for /f "tokens=*" %%i in (%1) do (
icacls.exe "F:\home\%%i" /grant "%%i:(oi)(ci)(m)"
)
)