在批处理文件中使用icacls(括号问题)

时间:2018-05-03 12:38:13

标签: batch-file brackets icacls

我需要将文件夹复制到PC的列表到特定位置 - 然后将该文件夹完全控制到Everyone并将其继承到所有子文件夹和文件。 我创建了一个包含PC列表的txt文件,然后将其包含在bat文件中。 它执行一个简单的ping来查看是否继续复制 - 然后执行一个简单的for / if / else语句 - 它通常适用于其他“维护”任务... 但是,在这种情况下,我无法使icacls命令正常工作。 我最初使用的命令是:

for /f %%a in (add_pclist.txt) do (

ping -n 2 %%a

if errorlevel 1 ( 

    echo %%a >> Test_PCFileCopyFail.txt
) else (

xcopy/e/h/i/y FOLDERNAME "\\%%a\c$\users\Public\Desktop"
icacls "\\%%a\c$\users\Public\Desktop\HMI" /grant Everyone:F /T
echo %%a >> Test_PCFileCopySuccess.txt
)
)

但是,尽管这样做了副本并且它使文件夹完全控制 - 当我查看属性中的“安全”选项卡时,每个人都没有刻度。我选择高级,虽然它将Everyone显示为完全控制,但'苹果'设置为'仅此文件夹' - 我希望它说'此文件夹,子文件夹和文件'。

如果我手动运行cmd:

icacls "\\%%a\c$\users\Public\Desktop\HMI" /grant Everyone:(OI)(CI)F /T
这是有效的。但是,当我将此命令放入批处理文件时,它会出错

(CI was unexpected at this time.

有没有办法在没有(OI)(CI)部分的情况下执行'适用于'部分 - 否则如何将其包含在批处理文件中而不会出现错误?我也试过包含/继承:e在原来的icacls命令中无济于事。

非常感谢!

1 个答案:

答案 0 :(得分:1)

由于icacls命令包含在code block(带括号的命令序列)中,因此可以看到)关闭code block以便查看cmd后面的字符{1}}成为下一个命令。

解决方案是将escape任意)打算用作文字,而不是使用插入符code block关闭^的特殊字符。

将违规)替换为^)(将有多个),以便将)视为常规字符,而不是特殊字符。