【问题标题】:Batch - Adding Users to Multiple Groups Through For Loop批处理 - 通过 For 循环将用户添加到多个组
【发布时间】:2013-03-09 10:00:20
【问题描述】:

在我的上一个问题中,我讨论了我是如何编写一个新的大众用户创建脚本的,现在大约有 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 循环尝试将用户添加到设置文件中定义的指定组,例如学生、StudentProxy、Year12 等。

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

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

任何帮助将不胜感激。

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

【问题讨论】:

  • GroupsAdd 可能为空。 SET "GroupsAdd... 行应该做什么?
  • GroupsAdd 不为空。设置文件中的行包含组,当我将 echo 设置为 off 时,它会写入正确的用户组。 GroupsAdd 应该创建一个命令:net group GROUPNAME /add USERNAME 并且每次组更改时都会更改 - 即如果我定义了三个组,它将执行三次。
  • 您正在尝试用/add !User! && net group 更改GroupsAdd 变量中所有出现的逗号。我可以给你两个不起作用的原因: 1. GroupsAdd 中不会有任何逗号,因为设置它的 for 循环的分隔符是逗号。 2. 里面包含&&,需要转义,否则会失败。我假设你不想这样做......?
  • 即使没有将分隔符设置为逗号,它仍然无法工作。 && 也应该可以工作,因为 set 函数被引号包围。请注意,如果脚本不必从 Excel 文件中读取,这将非常有效。 ETA:以逗号作为分隔符,它仍会将 Groups 设置为整个字符串,而不是用逗号分隔。
  • 何时读取 Excel 文件?我猜它在以前的代码中的某个地方。我不太确定它是否可以从 Excel 文件中读取,你以前做过吗?

标签: for-loop batch-file cmd


【解决方案1】:

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

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

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

  • 1234563之后。换句话说,!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,并将% 扩展替换为! 之一:

    ...
    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
    )
    

【讨论】:

  • 谢谢,第一个选项工作得很好,但是我无法让第二个选项工作。谢谢你的回答。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
相关资源
最近更新 更多