Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 批处理-通过For循环将用户添加到多个组_For Loop_Batch File_Cmd - Fatal编程技术网

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

For loop 批处理-通过For循环将用户添加到多个组,for-loop,batch-file,cmd,For Loop,Batch File,Cmd,在我的最后一个问题中,我讨论了我是如何编写一个新的大规模用户创建脚本的,现在大约有95行。我收到了这个问题的解决方案,并试图将其实现到代码的不同部分。现在,我正在尝试使用嵌套在主for循环中的for循环将用户从Excel文档添加到多个组中,for循环创建用户,mail启用用户等等 这就是我现在所拥有的: setlocal enabledelayedexpansion for /f "skip=37 tokens=* delims=," %%a in (Settings.ini) do ( set

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

这就是我现在所拥有的:

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
)
如您所见,脚本跳过设置文件中的37行,直到到达所需的行,并将groups变量设置为该行。下一个for循环尝试将用户添加到设置文件中定义的指定组中,例如学生、学生代理、12年级等

这就是代码失败的地方,它将我传递到net group的帮助菜单,我尝试过其他方法,例如不使用延迟扩展,并传递了一个错误,说明:

/Add is not recognised as an internal or external command, operable program or batch file.
任何帮助都将不胜感激


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

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

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

  • %
    扩展发生得更早,并且在它发生的特定时间,
    不应作为特殊符号进行处理和识别。所以,
    /add!用户!&&net group%
    位按字面插入,而不展开
    !用户

  • 稍后,当您展开整个
    组sadd
    时,
    不再工作,因为扩展这些代码的时间正是在扩展
    GroupsAdd
    时,而不是之后。换句话说,
    不是递归展开的

我可以在这里看到两种选择:

  • 放进去!群沙/将%%a
    添加到子例程中,替换
    %
    s的code>s和使用
    %User%
    %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 %"
    call :GroupsAdd
    )
    goto :EOF
    :GroupsAdd
    %GroupsAdd% /add %User%
    
  • 去掉
    User
    变量,然后在
    set GroupsAdd
    命令中,替换
    !用户%%a的code>以及带有
    %%
    扩展一:

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

  • GroupsAdd可能是空的。什么是布景“集体悲伤。。。行应该做什么?GroupsAdd不是空的。设置文件中的行包含组,当我将echo设置为off时,它会写入正确的用户组。GroupsAdd应该创建一个命令:net group GROUPNAME/add USERNAME,该命令在组每次更改时都会更改-即,如果我定义了三个组,它会执行三次。您正在尝试使用
    /add更改
    GroupsAdd
    变量中出现的所有逗号!用户!&&net组
    。我可以给你两个理由:1。
    GroupsAdd
    中不会有任何逗号,因为设置它的
    for
    循环的分隔符是逗号。2.它包含
    &&
    ,需要对其进行转义,否则它将失败。我假设你不想这样做…?即使不将delim设置为逗号,它仍然不起作用。由于set函数被引号包围,因此&&也应该起作用。请注意,如果脚本不必从Excel文件中读取,则此操作非常有效。ETA:使用逗号作为delimeter,它仍然会将组设置为整个字符串,而不是用逗号分隔。它什么时候从Excel文件中读取?我猜它在以前的代码中的某个地方。我不太确定它是否可以从Excel文件中读取,你以前做过吗?谢谢,第一个选项工作得很好,但是我无法让第二个选项工作。谢谢你的回答。