Windows icacls在括号中被打断

Windows icacls在括号中被打断,windows,batch-file,cmd,icacls,Windows,Batch File,Cmd,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

这确实有效,但不是我喜欢的格式。下面的代码将实现我想要的。在某些软件需要的任何可写标准用户配置文件(我知道它在某些系统配置文件(如默认配置文件等)中不起作用)中创建文件夹,并授予其相关权限

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
不过,这似乎有点过头了。我只想让一个循环遍历用户文件夹,然后用括号列出命令,为每个函数保存一个用户循环。但是,当我尝试下面的方法时,它甚至无法创建文件夹。如果我使用命令行进行调试,它会在“everyone”处停止,这在此时是出乎意料的。我不知道为什么?欢迎任何建议,谢谢

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

必须对(代码块)中的所有右括号进行转义,以避免将其解释为块的结尾

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
编辑正如建议的那样,使用子例程是另一种选择(尽管使用编辑器插入
^
转义没有什么大不了的)


必须对(代码块)中的所有右括号进行转义,以避免将其解释为块的结尾

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
编辑正如建议的那样,使用子例程是另一种选择(尽管使用编辑器插入
^
转义没有什么大不了的)


另一种选择是删除不必要的括号并引用必需的括号

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于“C:\Users\*”中的/d%%A,请执行以下操作(
对于(“%%~fA\AppData\Local\Folder1”“%%~fA\AppData\Local\Folder1_Ltd”)中的%%F,请执行以下操作(
mkdir“%%~fF”
icacls“%%~fF”/T/C/grant:r“所有人”:(OI)(CI)(F)“/继承权:e
)
)
如果要在
grant
开关中保留括号,则可以

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于“C:\Users\*”中的/d%%A,请执行以下操作(
对于(“%%~fA\AppData\Local\Folder1”“%%~fA\AppData\Local\Folder1_Ltd”)中的%%F,请执行以下操作(
mkdir“%%~fF”
icacls“%%~fF”/T/C”/grant(:r)“每个人”:(OI)(CI)(F)“/继承权:e
)
)
注意:这两种情况都在windows 10上测试过。我现在无法测试
icacls
处理引用参数的能力(在
/grant
案例中)是否存在于以前的操作系统版本中


注2:使用Windows 2003 server SP2版本的
icacls.exe
(发布的第一个版本)进行测试时没有出现问题(嗯,
/heritation
开关不存在)。正如eryksun所指出的,附加的引号由CRT删除。

另一种选择是删除不必要的括号并引用必需的括号

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于“C:\Users\*”中的/d%%A,请执行以下操作(
对于(“%%~fA\AppData\Local\Folder1”“%%~fA\AppData\Local\Folder1_Ltd”)中的%%F,请执行以下操作(
mkdir“%%~fF”
icacls“%%~fF”/T/C/grant:r“所有人”:(OI)(CI)(F)“/继承权:e
)
)
如果要在
grant
开关中保留括号,则可以

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于“C:\Users\*”中的/d%%A,请执行以下操作(
对于(“%%~fA\AppData\Local\Folder1”“%%~fA\AppData\Local\Folder1_Ltd”)中的%%F,请执行以下操作(
mkdir“%%~fF”
icacls“%%~fF”/T/C”/grant(:r)“每个人”:(OI)(CI)(F)“/继承权:e
)
)
注意:这两种情况都在windows 10上测试过。我现在无法测试
icacls
处理引用参数的能力(在
/grant
案例中)是否存在于以前的操作系统版本中


注2:使用Windows 2003 server SP2版本的
icacls.exe
(发布的第一个版本)进行测试时没有出现问题(嗯,
/heritation
开关不存在)。正如eryksun所指出的,CRT将删除附加引号。

您也可以使用WMI仅访问普通用户配置文件:

@Echo关闭
对于/F“Skip=1 Delims=“%%A In(
““WMIc路径Win32_用户配置文件,其中(特殊!='True')获取本地路径””
)为/F“Delims=“%%B In”(“%%%A”)执行的Do调用:Sub%%B
暂停>Nul
后藤:EOF
:Sub
对于(Folder1 Folder1_有限公司)中的%%A,请执行(如果不存在“%*\AppData\Local\%%A\”(
MD“%*\AppData\Local\%%A”)
ICACLS“%*\AppData\Local\%%A”/T/C/Q/grant:r每个人:(OI^)(CI^)F/继承:e)

您也可以使用WMI仅访问普通用户配置文件:

@Echo关闭
对于/F“Skip=1 Delims=“%%A In(
““WMIc路径Win32_用户配置文件,其中(特殊!='True')获取本地路径””
)为/F“Delims=“%%B In”(“%%%A”)执行的Do调用:Sub%%B
暂停>Nul
后藤:EOF
:Sub
对于(Folder1 Folder1_有限公司)中的%%A,请执行(如果不存在“%*\AppData\Local\%%A\”(
MD“%*\AppData\Local\%%A”)
ICACLS“%*\AppData\Local\%%A”/T/C/Q/grant:r每个人:(OI^)(CI^)F/继承:e)

调用一个子例程怎么样?“这似乎不那么乏味,也不那么容易出错。”埃里克森·阿克补充道,这是一个选择。啊,这是有道理的。谢谢:)现在离电脑不远,所以稍后会尝试并标记为已回答。改为调用子程序如何?“这似乎不那么乏味,也不那么容易出错。”埃里克森·阿克补充道,这是一个选择。啊,这是有道理的。谢谢:)现在刚离开电脑,所以稍后将尝试并标记为已应答。在Windows 10中,icacls.exe链接到专用Windows CRT msvcrt.dll并使用其
wmain
入口点。我不希望这个基本的设计与旧版本有所不同,所以我敢打赌这也适用于Windows7,尽管我还没有测试过。在将命令行解析到
argv
数组中时,CRT应该去掉
“%%~fF”
“/grant(:r)”
“Everyone”
、和
“(OI)(CI)(F)”
周围的引号。@eryksun,谢谢,这是我的想法,但可执行文件也可以使用API和实现