用括号

时间:2017-06-11 08:16:01

标签: 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 ("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

这似乎有点过头了。我想要通过用户文件夹进行一次循环,然后使用括号列出命令,为每个函数保存用户循环。但是当我尝试下面的内容时,它甚至没有制作文件夹。如果我使用命令行进行调试,则此时“大家”停止是意外的。我不知道为什么?欢迎任何建议,谢谢。

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

3 个答案:

答案 0 :(得分:4)

你必须将(代码块)中的所有右括号都转义为不被解释为块的结尾。

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

编辑eryksun建议使用子程序是一种替代方法(尽管使用编辑器插入^转义并不是什么大问题)

@Echo off
for /d %%A in ("C:\Users\*") do Call :Sub "%%~fA"
pause
Goto :Eof
:Sub
mkdir "%~f1\AppData\Local\Folder1" 
mkdir "%~f1\AppData\Local\Folder1_Ltd"
icacls "%~f1\AppData\Local\Folder1" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e
icacls "%~f1\AppData\Local\Folder1_Ltd" /T /C /grant(:r) "Everyone":(OI)(CI)(F) /inheritance:e

答案 1 :(得分:4)

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

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /d %%A in ("C:\Users\*") do (
        for %%F in ("%%~fA\AppData\Local\Folder1" "%%~fA\AppData\Local\Folder1_Ltd") do (
            mkdir "%%~fF"
            icacls "%%~fF" /T /C /grant:r "Everyone":"(OI)(CI)(F)" /inheritance:e
        )
    )

如果要将括号保留在grant开关中,则可以

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /d %%A in ("C:\Users\*") do (
        for %%F in ("%%~fA\AppData\Local\Folder1" "%%~fA\AppData\Local\Folder1_Ltd") do (
            mkdir "%%~fF"
            icacls "%%~fF" /T /C "/grant(:r)" "Everyone":"(OI)(CI)(F)" /inheritance:e
        )
    )

注意:在Windows 10上测试了两种情况。我现在无法测试icacls处理引用参数的能力(在/grant情况下)是存在于以前的OS版本中。

note2 :使用/inheritance(发布的第一个版本)的Windows 2003服务器SP2版本测试没有问题(好,icacls.exe切换不存在)。正如eryksun指出的那样,CRT删除了额外的引号。

答案 2 :(得分:1)

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

@Echo Off
For /F "Skip=1 Delims=" %%A In (
    '"WMIc Path Win32_UserProfile Where (Special!='True') Get LocalPath"'
    ) Do For /F "Delims=" %%B In ("%%A") Do Call :Sub %%B
Pause>Nul
GoTo :EOF

:Sub
For %%A In (Folder1 Folder1_Ltd) Do (If Not Exist "%*\AppData\Local\%%A\" (
        MD "%*\AppData\Local\%%A")
    ICACLS "%*\AppData\Local\%%A" /T /C /Q /grant:r Everyone:(OI^)(CI^)F /inheritance:e)