在我的上一个问题中,我讨论了我是如何开发新的大规模用户创建脚本的,现在大约是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文件中的用户添加到使用网络组的设置文件中的指定组,但是我现在这样做的方式不断失败,我需要帮助。
答案 0 :(得分:2)
请注意,!
用于延迟扩展。这意味着用!
s分隔的表达式应该在晚于用%
s分隔的表达式扩展。
在您目前的代码中,!
- 分隔的表达式放在%
- 分隔的表达式中。这样前者永远不会有机会扩展:
%
扩展更早发生,并且在特定时间发生!
扩展,/add !User! && net group %
s不应被处理并被识别为特殊符号。因此,!User!
位按字面插入,而不扩展GroupsAdd
。
稍后,当您展开整个!
内容时,其中的GroupsAdd
内容无法再次发挥作用,因为扩展它们的时间恰好是!
正在进行的时间扩展,而不是之后。换句话说,!GroupsAdd! /add %%a
s不会递归扩展。
我可以在这里看到两个选项:
将!
放入子例程,将%
替换为%%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
摆脱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}}