早上好。
我遇到了批处理脚本的问题。我有一个程序,它给它一个变量,我使用该变量创建一个文件夹,然后对它应用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。这有些瑕疵吗?
谢谢
答案 0 :(得分:1)
打开命令提示符窗口并运行set
以获取预定义环境变量列表的输出。有关每个预定义环境变量的说明,请参阅维基百科关于Windows Environment Variables的文章。
预定义的环境变量USERNAME
和PATH
不应在批处理文件中修改,除非有充分理由这样做。
另外要小心使用set variable="value"
而不是set "variable=value"
,因为在第一种情况下,双引号也被指定为环境变量的字符串值的一部分,也可能是现有的尾随空格/制表符。有关详细说明,请阅读
包含1个或多个空格的字符串必须用双引号括起来,因为如果在双引号字符串中找不到空格字符,则将其用作字符串分隔符。用户名可以包含空格。目录名Saved Games
肯定包含空格。
我建议使用此批处理代码:
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"
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
...解释%~2
(第二个参数没有引号)。cmd /?
...在需要双引号时在最后一个帮助页面上进行说明。icacls /?
md /?
rem /?
set /?