如有一个csv文件,格式如下,通过windows批量创建用户,要求 密码永不过期,用户不可更改密码。工号为用户名,密码为密码。姓名为显示名称,部门为描述信息。
工号,密码,姓名,部门,
AB001,123456,张三,财务部,
AB002,456789,李四,质量部,
...
这是一个用于处理文件内容的 for /f 循环语句脚本
解析该语句中的各个部分:
/f 表示对文件进行迭代循环。
"usebackq" 告诉循环命令使用反引号包围的文件名称作为文件名,而不仅仅是一个字符串(对于带有空格的文件名)。
skip=1 表示跳过第一行,即标题行。
tokens=1-4 指定要提取的字段范围。在这个例子中,它表示将每行以逗号(,)作为分隔符分成四个字段,并使用变量 %%a、%%b、%%c 和 %%d 分别表示这些字段。
delims=, 用逗号作为字段间的分隔符。
因此,该 for /f 循环遍历从 %csv_file% 文件中读取的行(不包括第一行),并将每行按逗号进行分割,将结果赋值给相应的变量(%%a、%%b、%%c 和 %%d)。然后,循环代码块中的操作可以使用这些变量来进行进一步处理。
@echo off
setlocal enabledelayedexpansion
set "csv_file=users.csv"
set "log_file=log.txt"
for /f "usebackq skip=1 tokens=1-4 delims=," %%a in ("%csv_file%") do (
set "username=%%a"
set "password=%%b"
set "displayname=%%c"
set "description=%%d"
net user !username! !password! /add /passwordchg:no /expires:never >> "%log_file%"
if %errorlevel% equ 0 (
echo User !username! created successfully. >> "%log_file%"
) else (
echo Error creating user !username!. >> "%log_file%"
)
wmic useraccount where "Name='!username!'" set Description="!description!" >> "%log_file%"
wmic useraccount where "Name='!username!'" set PasswordExpires=false >> "%log_file%"
wmic useraccount where "Name='!username!'" set FullName="!displayname!" >> "%log_file%"
)
echo -----------Script completed. Press any key to exit.-----------
endlocal
-
请根据您的需要,将上述代码保存为批处理文件(例如create_users.bat)。确保将CSV文件路径的csv_file变量设置为实际的CSV文件路径。
-
该脚本使用了FOR /F命令来读取CSV文件,并使用逗号作为分隔符。每一行的字段会被分别赋值给对应的变量。然后,使用NET USER命令来创建用户,使用WMIC命令禁用远程登录,并使用WMIC命令设置显示名称和备注信息。
setlocal enabledelayedexpansion 和 endlocal 是用于启用和禁用批处理脚本中的 "延迟变量扩展" 功能。
在批处理中,默认情况下,对变量的引用是立即解析的,也就是说,在执行时它们只会被替换成相应的值一次。但是,有时我们希望在批处理的执行过程中,在每次循环或条件判断中可以动态地读取和更新变量的值。
启用延迟变量扩展后,变量使用叹号(!)而不是百分号(%)进行包围,以表示它是一个可以被延迟解析的变量。这样可以实现更灵活的变量操作。
setlocal enabledelayedexpansion 命令将启用延迟变量扩展功能,endlocal 命令则用于恢复到原始的环境状态并关闭延迟变量扩展。
在上述的脚本中,enabledelayedexpansion 被启用后,才能在 for 循环的代码块中使用叹号语法(例如:!username!)来获取变量的延迟解析值。
请注意,延迟变量扩展功能在某些情况下可能会导致意料之外的结果。因此,在使用延迟变量扩展时,需谨慎处理变量的处理和引用,以确保正确的解析和结果。