批量 - 通过For循环将用户添加到多个组

时间:2013-03-09 10:00:20

标签: for-loop batch-file cmd

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

现在这就是我所拥有的:

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
)

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

这就是代码失败的地方,它将我带到网络组的帮助菜单,我已经尝试了其他一些事情,例如不使用延迟扩展,并且发出错误说明:

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

非常感谢任何帮助。

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

1 个答案:

答案 0 :(得分:2)

请注意,!用于延迟扩展。这意味着用! s分隔的表达式应该在晚于用% s分隔的表达式扩展。

在您目前的代码中,! - 分隔的表达式放在% - 分隔的表达式中。这样前者永远不会有机会扩展:

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

  • 稍后,当您展开整个!内容时,其中的GroupsAdd内容无法再次发挥作用,因为扩展它们的时间恰好是!正在进行的时间扩展,而不是之后。换句话说,!GroupsAdd! /add %%a s不会递归扩展。

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

  1. !放入子例程,将%替换为%%a s,将%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%

    User
  2. 摆脱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 ) 一个扩展:

    {{1}}