批处理文件中的 icacls 变量

批处理文件中的 icacls 变量

我正在将用户移至新域、文件服务器和用户名格式。我正在尝试编写一个简单的 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)"
    )
)

相关内容