1

早上好。

我的批处理脚本有问题。我有一个程序为其提供一个变量,我使用该变量创建一个文件夹,然后对其应用 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的一些缺陷吗?

谢谢

4

1 回答 1

1

打开命令提示符窗口并运行set以获取预定义环境变量列表的输出。有关每个预定义环境变量的描述,请参见例如关于Windows 环境变量的 Wikipedia 文章。

预定义的环境变量不应在批处理文件中进行修改USERNAMEPATH除非有充分的理由这样做。

使用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 /?
于 2016-10-18T17:22:46.397 回答