标题: [系统相关] BAT脚本怎样批量添加更新域用户组的用户? [打印本页]
作者: fjzj86 时间: 2024-1-15 15:20 标题: BAT脚本怎样批量添加更新域用户组的用户?
求助编写一个批处理文件:
1、从userList.txt文件的第二行读取用户名,第一行读取用户分组
2、使用命令net group /domain,更新用户分组(和命令行返回的名单比较,中原有的用户名比较userList.txt有的添加用户,没有的删除用户)
自己简单编写了一个test批处理,执行后没啥效果,直接闪退。求帮忙看看- ::@echo off
- setlocal enabledelayedexpansion
-
- set "inputFile=userList.txt"
- set "outputFile=1.txt"
-
- REM 读取用户分组
- for /f "tokens=1,* delims= " %%A in ('type "%inputFile%"') do (
- set "group=%%B"
- @echo %group%
- pause
- goto :next
- )
- :next
-
- REM 循环读取用户名并进行更新操作
- for /f "tokens=1,* delims= " %%A in ('type "%inputFile%" ^| findstr /n "^"') do (
- set "userName=%%B"
- set "command=net group /domain "%group%" /add "%userName%""
- %command% > "%outputFile%" 2>&1
- echo %userName% >> "%outputFile%" 2>&1
- ) > nul
-
- REM 删除不在userList.txt中的用户
- for /f "tokens=1,* delims= " %%A in ('net group /domain "%group%" ^| findstr /n "^"') do (
- set "userName=%%B"
- set "checkUser=1"
- for /f "tokens=1,* delims= " %%C in ('type "%inputFile%" ^| findstr /n "^"') do (
- if "%%D"=="%userName%" (
- set "checkUser=0"
- goto :continue
- )
- )
- if !checkUser!==1 (
- net group /domain "%group%" "%userName%" /delete > "%outputFile%" 2>&1
- echo Deleted user: %userName% >> "%outputFile%" 2>&1
- )
- :continue
- ) > nul
-
- echo 更新完成。结果已保存在 %outputFile% 文件中。
- pause
复制代码
这个是执行命令后返回的内容,需要提取出administrator、admin
这项请求将在域 group.com 的域控制器处理。
组名 Domain Admins
注释 指定的域管理员
成员
-------------------------------------------------------------------------------
administrator admin domainadm
crm dbcr dlcr
命令成功完成。
作者: Batcher 时间: 2024-1-15 20:56
回复 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
作者: 77七 时间: 2024-1-15 21:30
- 不了解net命令,以下是一些net以外的错误
-
- 第10、19、20行等
- !group! !userName! !command!等需要使用!!包裹变量
-
- 第17行等
- type "%inputFile%" ^| findstr /n "^"
- 空行也是需要处理的吗?
-
- 第18行
- userName 和系统原有的变量冲突
-
- 第38行
- 标签不要写在括号内
- 既然 set "checkUser=0" if !checkUser!==1 ()自然不会执行,为什么还要跳过去
复制代码
作者: fjzj86 时间: 2024-1-15 22:03
回复 2# Batcher
好的,这个是AI生成的,有点乱,后来看了namejm老师的关于FOR的用法,代码重新编写后,可以正常使用了。
作者: fjzj86 时间: 2024-1-15 22:04
回复 3# 77七
感谢,百度AI写的代码,有点乱,后来重新写过了。
作者: fjzj86 时间: 2024-1-15 22:06
补一下正确代码。- @echo off
- echo =======================================
- echo 【域分用户组批量更新程序】 设计:Fjzj86
- echo =======================================
- echo=
- echo=
- setlocal enabledelayedexpansion
- set "inputFile=userList.txt"
- set "outputFile=userdomain.txt"
- if not exist !inputFile! (
- echo "请新增userList.txt文件,注意必须ANSI格式!,第一行填写用户组,后面填写用户名!"
- pause
- exit /b
- )
-
- echo 正在读取用户分组名称……
- for /f "tokens=*" %%G in (%inputFile%) do (
- set "group=%%G"
- echo 增加添加分组【!group!】的用户
- goto :break
- )
- :break
- echo=
- echo 读取域分组用户表……
- for /f "skip=8 tokens=1,2,3 delims= " %%A in ('net group /domain "%group%" ') do (
- echo %%A
- echo %%B
- echo %%C
- ) > %outputFile%
-
- echo 分组用户表已读取完成!
- echo=
- echo =================================
- echo 正在比较用户……添加新用户
- echo =================================
- set "result=0"
- for /f "skip=1 tokens=1 delims= " %%a in (%inputFile%) do (
- for /f "tokens=1 delims= " %%b in (%outputFile%) do (
- set "userName=%%a"
- ::echo A=B是:"%%a"=="%%b"
- if "%%a"=="%%b" (
- set "result=1"
- )
- )
- REM :end1
- if "!result!"=="1" (
- REM echo 用户名 !userName! 已存在,跳过
- ) else (
- echo 正添加【!userName!】中
- pause
- net group /domain "!group!" /add !userName! >nul 2>&1
- if errorlevel 1 (
- echo 用户【!userName!】添加失败
- set /a "Failure_N+=1"
- ) else (
- echo 用户【!userName!】添加成功
- set /a "Success_N+=1"
- )
- echo -----------------------------------
- )
-
- set "result=0"
- )
- echo=
- echo =================================
- echo 正在比较用户……删除多余用户
- echo =================================
- set "result=0"
- for /f "tokens=1 delims= " %%b in (%outputFile%) do (
- for /f "skip=1 tokens=1 delims= " %%a in (%inputFile%) do (
- set "userName=%%b"
- ::echo A=B是:"%%a"=="%%b"
- if "%%b"=="%%a" (
- set "result=1"
- )
- )
-
- if "!result!"=="1" (
- REM echo 用户名 !userName! 正常账号,跳过
- ) else (
- echo 用户名【!userName!】多余,正删除中
- pause
- net group /domain "!group!" /delete !userName! >nul 2>&1
- if errorlevel 1 (
- echo 用户【!userName!】删除失败
- set /a "Failure_M+=1"
- ) else (
- echo 用户【!userName!】删除成功
- set /a "Success_M+=1"
- )
- echo -----------------------------------
- )
- set "result=0"
- )
- echo =========添加结束===============
- echo 添加用户成功:!Success_N!个,失败:!Failure_N!个
- echo 删除用户成功:!Success_M!个,失败:!Failure_M!个
- echo =============================
- net group %Group% /domain
- pause
复制代码
作者: fjzj86 时间: 2024-1-15 22:14
还有点问题就是25行代码生成的userdomain.txt,最后几行有多余的内容:
命令成功完成
ECHO出错的情况。
不知道怎么过滤一下。
作者: Batcher 时间: 2024-1-16 09:09
回复 7# fjzj86
找一个组作为例子,例如xyz,执行命令:- net group /domain "xyz" > out.txt
复制代码
把生成的 out.txt 上传到网盘,详细说明一下你希望得到的结果是怎样的?你的for命令实际得到的效果又是怎样的?
我帮你修改代码。
作者: fjzj86 时间: 2024-1-16 11:27
回复 8# Batcher
感谢帮忙,下面引用部分就是命令返回的结果
附件:1.txt https://www.alipan.com/s/sX2GfubQUDt
这项请求将在域 group.com 的域控制器处理。
组名 Domain Admins
注释 指定的域管理员
成员
-------------------------------------------------------------------------------
administrator admin domainadm
crm dbcr dlcr
命令成功完成。
昨晚自己写了一下,勉强能达到效果,请教还有没有能简化的代码- echo 读取域分组用户表……
- (for /f "skip=8 tokens=1,2,3 delims= " %%A in ('net group /domain "%group%" ') do (
- if not "%%A"=="命令成功完成。" (
- if NOT "%%A"=="" ( echo %%A)
- if NOT "%%B"=="" ( echo %%B)
- if NOT "%%C"=="" ( echo %%C)
- )
- )
- ) > 2.txt
复制代码
作者: Batcher 时间: 2024-1-16 16:55
回复 9# fjzj86 - (for /f "skip=8 tokens=1-3" %%A in ('net group /domain "%group%" ^| findstr /v /i /c:"命令成功完成"') do (
- if not "%%A"=="" (echo,%%A)
- if not "%%B"=="" (echo,%%B)
- if not "%%C"=="" (echo,%%C)
- ))>2.txt
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |