找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 22487|回复: 9

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

[复制链接]
发表于 2024-1-15 15:20:24 | 显示全部楼层 |阅读模式
求助编写一个批处理文件:
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
命令成功完成。
发表于 2024-1-15 20:56:58 | 显示全部楼层
回复 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
发表于 2024-1-15 21:30:13 | 显示全部楼层
  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 ()自然不会执行,为什么还要跳过去
复制代码
 楼主| 发表于 2024-1-15 22:03:36 | 显示全部楼层
回复 2# Batcher


    好的,这个是AI生成的,有点乱,后来看了namejm老师的关于FOR的用法,代码重新编写后,可以正常使用了。
 楼主| 发表于 2024-1-15 22:04:25 | 显示全部楼层
回复 3# 77七


    感谢,百度AI写的代码,有点乱,后来重新写过了。
 楼主| 发表于 2024-1-15 22:06:06 | 显示全部楼层
补一下正确代码。
  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.                        
  60.         set "result=0"
  61. )
  62. echo=
  63. echo =================================
  64. echo 正在比较用户……删除多余用户
  65. echo =================================
  66. set "result=0"
  67. for /f "tokens=1 delims= " %%b in (%outputFile%) do (
  68.     for /f "skip=1 tokens=1 delims= " %%a in (%inputFile%) do (
  69.                 set "userName=%%b"
  70.                 ::echo A=B是:"%%a"=="%%b"
  71.                 if "%%b"=="%%a" (
  72.                         set "result=1"
  73.                 )
  74.         )

  75.     if "!result!"=="1" (
  76.                 REM echo 用户名 !userName! 正常账号,跳过
  77.         ) else (
  78.                         echo 用户名【!userName!】多余,正删除中                       
  79.                         pause
  80.                         net group /domain "!group!" /delete !userName! >nul 2>&1
  81.                         if errorlevel 1 (
  82.                                 echo 用户【!userName!】删除失败
  83.                                 set /a "Failure_M+=1"
  84.                         ) else (
  85.                                 echo 用户【!userName!】删除成功
  86.                                 set /a "Success_M+=1"
  87.                         )
  88.                         echo -----------------------------------
  89.                 )       
  90.         set "result=0"
  91. )
  92. echo =========添加结束===============
  93. echo 添加用户成功:!Success_N!个,失败:!Failure_N!个
  94. echo 删除用户成功:!Success_M!个,失败:!Failure_M!个
  95. echo =============================
  96. net group %Group% /domain
  97. pause
复制代码
 楼主| 发表于 2024-1-15 22:14:07 | 显示全部楼层
还有点问题就是25行代码生成的userdomain.txt,最后几行有多余的内容:
命令成功完成
ECHO出错的情况。
不知道怎么过滤一下。
发表于 2024-1-16 09:09:10 | 显示全部楼层
回复 7# fjzj86


找一个组作为例子,例如xyz,执行命令:
  1. net group /domain "xyz" > out.txt
复制代码
把生成的 out.txt 上传到网盘,详细说明一下你希望得到的结果是怎样的?你的for命令实际得到的效果又是怎样的?
我帮你修改代码。
 楼主| 发表于 2024-1-16 11:27:10 | 显示全部楼层
回复 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
复制代码
发表于 2024-1-16 16:55:42 | 显示全部楼层
回复 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技术 +1 收起 理由
fjzj86 + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 06:42 , Processed in 0.020218 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表