向 icacls 提供外部变量时出现奇怪的问题
Odd issue when feeding icacls an external variable
早上好。
我的批处理脚本有问题。我有一个为其提供变量的程序,我使用该变量创建一个文件夹,然后对其应用 Icalcs 权限。出于某种原因,它将创建具有变量名称的文件夹,但 Icalcs 将在变量应在的位置为空白。这是代码 -
set whodo=%2
set username=%whodo%
set path="\example\shares\Student\%username%"
md %path%
md %path%\Desktop
md %path%\Contacts
md %path%\Favorites
md %path%\Links
md %path%\Music
md %path%\Pictures
md %path%\Saved Games
md %path%\Searches
md %path%\Video
md %path%\Documents
c:\windows\system32\icacls.exe %path% /T /C /inheritance:e /grant:r %username%:(OI)(CI)M
%2 从运行此脚本的程序中提取变量,然后我将该变量放入另一个变量中以查看这是否会让 Icacls 满意,但事实并非如此。如果没有从程序中提取的变量,这个脚本就可以正常工作。我无法弄清楚为什么 Path 和 Username 变量在除 Icacls 之外的任何地方都有效。这是 icacls 的一些缺陷吗?
谢谢
打开命令提示符 window 和 运行 set
以获取预定义环境变量列表的输出。有关每个预定义环境变量的描述,请参见例如关于 Windows Environment Variables.
的维基百科文章
不应在批处理文件中修改预定义的环境变量 USERNAME
和 PATH
,除非有充分的理由这样做。
在使用 set variable="value"
而不是 set "variable=value"
时也要小心,因为在第一种情况下,双引号也作为字符串值的一部分分配给环境变量,并且可能存在尾随 spaces/tabs, 也。有关详细说明,请阅读
上的答案
- Why is no string output with 'echo %var%' after using 'set var = text' on command line?
并且包含 1 个或多个 space 的字符串必须用双引号引起来,因为如果在双引号字符串中找不到 space 字符,则字符将用作字符串分隔符。用户名可以包含 space。目录名称 Saved Games
肯定包含一个 space.
我建议使用这个批号:
rem Get name of user with surrounding double quotes removed.
set "whodo=%~2"
set "NameUser=%whodo%"
set "PathUser=\example\shares\Student\%NameUser%"
rem Create directories for this user on server. With command extensions
rem enabled as by default the command MD creates the entire directory
rem tree if that is necessary. Therefore it is not necessary to create
rem separately the profile directory of the user first.
md "%PathUser%\Desktop"
md "%PathUser%\Contacts"
md "%PathUser%\Favorites"
md "%PathUser%\Links"
md "%PathUser%\Music
md "%PathUser%\Pictures"
md "%PathUser%\Saved Games"
md "%PathUser%\Searches"
md "%PathUser%\Video"
md "%PathUser%\Documents"
%SystemRoot%\System32\icacls.exe "%PathUser%" /T /C /inheritance:e /grant:r "%NameUser%:(OI)(CI)M"
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 解释 %~2
(第二个参数没有引号)。
cmd /?
... 在最后的帮助页面上解释了何时需要双引号。
icacls /?
md /?
rem /?
set /?
早上好。
我的批处理脚本有问题。我有一个为其提供变量的程序,我使用该变量创建一个文件夹,然后对其应用 Icalcs 权限。出于某种原因,它将创建具有变量名称的文件夹,但 Icalcs 将在变量应在的位置为空白。这是代码 -
set whodo=%2
set username=%whodo%
set path="\example\shares\Student\%username%"
md %path%
md %path%\Desktop
md %path%\Contacts
md %path%\Favorites
md %path%\Links
md %path%\Music
md %path%\Pictures
md %path%\Saved Games
md %path%\Searches
md %path%\Video
md %path%\Documents
c:\windows\system32\icacls.exe %path% /T /C /inheritance:e /grant:r %username%:(OI)(CI)M
%2 从运行此脚本的程序中提取变量,然后我将该变量放入另一个变量中以查看这是否会让 Icacls 满意,但事实并非如此。如果没有从程序中提取的变量,这个脚本就可以正常工作。我无法弄清楚为什么 Path 和 Username 变量在除 Icacls 之外的任何地方都有效。这是 icacls 的一些缺陷吗?
谢谢
打开命令提示符 window 和 运行 set
以获取预定义环境变量列表的输出。有关每个预定义环境变量的描述,请参见例如关于 Windows Environment Variables.
不应在批处理文件中修改预定义的环境变量 USERNAME
和 PATH
,除非有充分的理由这样做。
在使用 set variable="value"
而不是 set "variable=value"
时也要小心,因为在第一种情况下,双引号也作为字符串值的一部分分配给环境变量,并且可能存在尾随 spaces/tabs, 也。有关详细说明,请阅读
- Why is no string output with 'echo %var%' after using 'set var = text' on command line?
并且包含 1 个或多个 space 的字符串必须用双引号引起来,因为如果在双引号字符串中找不到 space 字符,则字符将用作字符串分隔符。用户名可以包含 space。目录名称 Saved Games
肯定包含一个 space.
我建议使用这个批号:
rem Get name of user with surrounding double quotes removed.
set "whodo=%~2"
set "NameUser=%whodo%"
set "PathUser=\example\shares\Student\%NameUser%"
rem Create directories for this user on server. With command extensions
rem enabled as by default the command MD creates the entire directory
rem tree if that is necessary. Therefore it is not necessary to create
rem separately the profile directory of the user first.
md "%PathUser%\Desktop"
md "%PathUser%\Contacts"
md "%PathUser%\Favorites"
md "%PathUser%\Links"
md "%PathUser%\Music
md "%PathUser%\Pictures"
md "%PathUser%\Saved Games"
md "%PathUser%\Searches"
md "%PathUser%\Video"
md "%PathUser%\Documents"
%SystemRoot%\System32\icacls.exe "%PathUser%" /T /C /inheritance:e /grant:r "%NameUser%:(OI)(CI)M"
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
... 解释%~2
(第二个参数没有引号)。cmd /?
... 在最后的帮助页面上解释了何时需要双引号。icacls /?
md /?
rem /?
set /?