[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] BAT脚本怎样批量添加更新域用户组的用户?

求助编写一个批处理文件:
1、从userList.txt文件的第二行读取用户名,第一行读取用户分组
2、使用命令net group /domain,更新用户分组(和命令行返回的名单比较,中原有的用户名比较userList.txt有的添加用户,没有的删除用户)

自己简单编写了一个test批处理,执行后没啥效果,直接闪退。求帮忙看看
  1. ::@echo off
  2. setlocal enabledelayedexpansion
  3. set "inputFile=userList.txt"
  4. set "outputFile=1.txt"
  5. REM 读取用户分组
  6. for /f "tokens=1,* delims= " %%A in ('type "%inputFile%"') do (
  7.     set "group=%%B"
  8.     @echo %group%
  9.     pause
  10.     goto :next
  11. )
  12. :next
  13. REM 循环读取用户名并进行更新操作
  14. for /f "tokens=1,* delims= " %%A in ('type "%inputFile%" ^| findstr /n "^"') do (
  15.     set "userName=%%B"
  16.     set "command=net group /domain "%group%" /add "%userName%""
  17.     %command% > "%outputFile%" 2>&1
  18.     echo %userName% >> "%outputFile%" 2>&1
  19. ) > nul
  20. REM 删除不在userList.txt中的用户
  21. for /f "tokens=1,* delims= " %%A in ('net group /domain "%group%" ^| findstr /n "^"') do (
  22.     set "userName=%%B"
  23.     set "checkUser=1"
  24.     for /f "tokens=1,* delims= " %%C in ('type "%inputFile%" ^| findstr /n "^"') do (
  25.         if "%%D"=="%userName%" (
  26.             set "checkUser=0"
  27.             goto :continue
  28.         )
  29.     )
  30.     if !checkUser!==1 (
  31.         net group /domain "%group%" "%userName%" /delete > "%outputFile%" 2>&1
  32.         echo Deleted user: %userName% >> "%outputFile%" 2>&1
  33.     )
  34. :continue
  35. ) > nul
  36. echo 更新完成。结果已保存在 %outputFile% 文件中。
  37. pause
复制代码
这个是执行命令后返回的内容,需要提取出administrator、admin
这项请求将在域 group.com 的域控制器处理。
组名     Domain Admins
注释     指定的域管理员

成员

-------------------------------------------------------------------------------
administrator            admin                 domainadm
crm                         dbcr                    dlcr
命令成功完成。

回复 1# fjzj86


请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

请参考Q-04和Q-05把bat文件和txt文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

如果需要上传文件,请用使用网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. 不了解net命令,以下是一些net以外的错误
  2. 第10、19、20行等
  3. !group! !userName! !command!等需要使用!!包裹变量
  4. 第17行等
  5. type "%inputFile%" ^| findstr /n "^"
  6. 空行也是需要处理的吗?
  7. 第18行
  8. userName 和系统原有的变量冲突
  9. 第38行
  10. 标签不要写在括号内
  11. 既然 set "checkUser=0" if !checkUser!==1 ()自然不会执行,为什么还要跳过去
复制代码
bat小白,请多指教!谢谢!

TOP

回复 2# Batcher


    好的,这个是AI生成的,有点乱,后来看了namejm老师的关于FOR的用法,代码重新编写后,可以正常使用了。

TOP

回复 3# 77七


    感谢,百度AI写的代码,有点乱,后来重新写过了。

TOP

补一下正确代码。
  1. @echo off
  2. echo =======================================
  3. echo 【域分用户组批量更新程序】 设计:Fjzj86
  4. echo =======================================
  5. echo=
  6. echo=
  7. setlocal enabledelayedexpansion
  8. set "inputFile=userList.txt"
  9. set "outputFile=userdomain.txt"
  10. if not exist !inputFile! (
  11.     echo "请新增userList.txt文件,注意必须ANSI格式!,第一行填写用户组,后面填写用户名!"
  12.     pause
  13.     exit /b
  14. )
  15. echo 正在读取用户分组名称……
  16. for /f "tokens=*" %%G in (%inputFile%) do (
  17.     set "group=%%G"
  18.     echo 增加添加分组【!group!】的用户
  19.     goto :break
  20. )
  21. :break
  22. echo=
  23. echo 读取域分组用户表……
  24. for /f "skip=8 tokens=1,2,3 delims= " %%A in ('net group /domain "%group%" ') do (
  25.    echo %%A
  26.    echo %%B
  27.    echo %%C
  28.   ) > %outputFile%
  29. echo 分组用户表已读取完成!
  30. echo=
  31. echo =================================
  32. echo 正在比较用户……添加新用户
  33. echo =================================
  34. set "result=0"
  35. for /f "skip=1 tokens=1 delims= " %%a in (%inputFile%) do (
  36.     for /f "tokens=1 delims= " %%b in (%outputFile%) do (
  37. set "userName=%%a"
  38. ::echo A=B是:"%%a"=="%%b"
  39. if "%%a"=="%%b" (
  40. set "result=1"
  41. )
  42. )
  43. REM :end1
  44.     if "!result!"=="1" (
  45. REM echo 用户名 !userName! 已存在,跳过
  46. ) else (
  47. echo 正添加【!userName!】中
  48. pause
  49. net group /domain "!group!" /add !userName! >nul 2>&1
  50. if errorlevel 1 (
  51. echo 用户【!userName!】添加失败
  52. set /a "Failure_N+=1"
  53. ) else (
  54. echo 用户【!userName!】添加成功
  55. set /a "Success_N+=1"
  56. )
  57. echo -----------------------------------
  58. )
  59. set "result=0"
  60. )
  61. echo=
  62. echo =================================
  63. echo 正在比较用户……删除多余用户
  64. echo =================================
  65. set "result=0"
  66. for /f "tokens=1 delims= " %%b in (%outputFile%) do (
  67.     for /f "skip=1 tokens=1 delims= " %%a in (%inputFile%) do (
  68. set "userName=%%b"
  69. ::echo A=B是:"%%a"=="%%b"
  70. if "%%b"=="%%a" (
  71. set "result=1"
  72. )
  73. )
  74.     if "!result!"=="1" (
  75. REM echo 用户名 !userName! 正常账号,跳过
  76. ) else (
  77. echo 用户名【!userName!】多余,正删除中
  78. pause
  79. net group /domain "!group!" /delete !userName! >nul 2>&1
  80. if errorlevel 1 (
  81. echo 用户【!userName!】删除失败
  82. set /a "Failure_M+=1"
  83. ) else (
  84. echo 用户【!userName!】删除成功
  85. set /a "Success_M+=1"
  86. )
  87. echo -----------------------------------
  88. )
  89. set "result=0"
  90. )
  91. echo =========添加结束===============
  92. echo 添加用户成功:!Success_N!个,失败:!Failure_N!个
  93. echo 删除用户成功:!Success_M!个,失败:!Failure_M!个
  94. echo =============================
  95. net group %Group% /domain
  96. pause
复制代码

TOP

还有点问题就是25行代码生成的userdomain.txt,最后几行有多余的内容:
命令成功完成
ECHO出错的情况。
不知道怎么过滤一下。

TOP

回复 7# fjzj86


找一个组作为例子,例如xyz,执行命令:
  1. net group /domain "xyz" > out.txt
复制代码
把生成的 out.txt 上传到网盘,详细说明一下你希望得到的结果是怎样的?你的for命令实际得到的效果又是怎样的?
我帮你修改代码。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 8# Batcher
感谢帮忙,下面引用部分就是命令返回的结果
附件:1.txt  https://www.alipan.com/s/sX2GfubQUDt
这项请求将在域 group.com 的域控制器处理。
组名     Domain Admins
注释     指定的域管理员

成员

-------------------------------------------------------------------------------
administrator            admin                 domainadm
crm                         dbcr                    dlcr
命令成功完成。


昨晚自己写了一下,勉强能达到效果,请教还有没有能简化的代码
  1. echo 读取域分组用户表……
  2. (for /f "skip=8 tokens=1,2,3 delims= " %%A in ('net group /domain "%group%" ') do (
  3. if not "%%A"=="命令成功完成。" (
  4. if NOT "%%A"=="" ( echo %%A)
  5. if NOT "%%B"=="" ( echo %%B)
  6. if NOT "%%C"=="" ( echo %%C)
  7. )
  8. )
  9.   ) > 2.txt
复制代码

TOP

回复 9# fjzj86
  1. (for /f "skip=8 tokens=1-3" %%A in ('net group /domain "%group%" ^| findstr /v /i /c:"命令成功完成"') do (
  2.     if not "%%A"=="" (echo,%%A)
  3.     if not "%%B"=="" (echo,%%B)
  4.     if not "%%C"=="" (echo,%%C)
  5. ))>2.txt
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表