0

在我的最后一个问题中,我讨论了我是如何编写一个新的大众用户创建脚本的,现在大约有 95 行。我收到了该问题的解决方案,并尝试将其实现到代码的不同部分。现在我正在尝试使用嵌套在创建用户的主 for 循环中的 for 循环将用户从 Excel 文档添加到多个组,邮件启用它们等。

现在这就是我所拥有的:

setlocal enabledelayedexpansion
for /f "skip=37 tokens=* delims=," %%a in (Settings.ini) do (
set Groups=%%a
)


for /f "skip=1 Tokens=1,2,3 Delims=," %%a in (C:\UserList.csv) do (
set User=%%a
set "GroupsAdd=net group %groups:,= /add !User! && net group %"
!GroupsAdd! /add %%a
)

如您所见,脚本跳过设置文件中的三十七行,直到到达所需的行并将组变量设置为该行。下一个 for 循环尝试将用户添加到设置文件中定义的指定组,例如 Student、StudentProxy、Year12 等。

那是代码失败的地方,它把我带到了网络组的帮助菜单,我已经尝试了其他的东西,比如不使用延迟扩展,并且提供了一个错误说明:

/Add is not recognised as an internal or external command, operable program or batch file.

任何帮助将不胜感激。

TL;DR 我需要创建一个函数,该函数将使用网络组将 Excel 文件中的用户添加到设置文件中的指定组,但是我现在这样做的方式不断失败,我需要帮助。

4

1 回答 1

2

请记住,!s 用于延迟扩展。这意味着以!s 分隔的表达式应该比以 s 分隔的表达式扩展得晚%

在您当前的代码中,一个!-delimited 表达式放在一个%-delimited 中。这样,前者永远没有机会扩展:

  • %扩展发生得更早,并且在它发生的特定时间发生,s!不应该被处理和识别为特殊符号。因此,该/add !User! && net group %位按字面意思插入,而不扩展!User!.

  • 后来,当你扩展整个GroupsAdd东西时,!它里面的 s 就不再起作用了,因为扩展它们的时间正是在GroupsAdd扩展的时候,而不是之后。换句话说,!s 不是递归扩展的。

我可以在这里看到两个选项:

  1. !GroupsAdd! /add %%a放入子例程中,将!s替换为%s 和:%%a%User%

    ...
    for /f "skip=1 Tokens=1,2,3 Delims=," %%a in (C:\UserList.csv) do (
    set User=%%a
    set "GroupsAdd=net group %groups:,= /add !User! && net group %"
    call :GroupsAdd
    )
    goto :EOF
    :GroupsAdd
    %GroupsAdd% /add %User%
    
  2. 去掉User变量,在set GroupsAdd命令中,用 替换!User!%%a以及%用 1 替换扩展!

    ...
    for /f "skip=1 Tokens=1,2,3 Delims=," %%a in (C:\UserList.csv) do (
    set "GroupsAdd=net group !groups:,= /add %%a && net group !"
    !GroupsAdd! /add %%a
    )
    
于 2013-03-09T11:28:01.857 回答