批处理脚本需求:查看、删除并重新映射网络驱动器(更新密码)
嘿,我瞅了下你的批处理脚本问题——核心问题是原代码只打印了删除命令但根本没实际执行,而且嵌套的for循环逻辑有点冗余,还没处理WMIC输出自带的空行干扰。下面是给你改好的完整脚本,完美实现「删除指定服务器的所有映射→用新密码重新映射」的需求:
@echo off setlocal enabledelayedexpansion set "target_server=srv1" set "domain_user=dom/uid1" set "new_pwd=pwd" :: 第一步:批量删除与目标服务器关联的所有网络驱动器 echo 正在清理与 %target_server% 相关的旧映射... for /f "skip=1 tokens=1,2 delims=" %%a in ('wmic logicaldisk get Caption^, ProviderName ^| findstr /i /v "^$"') do ( :: 过滤WMIC输出的空行,提取驱动器号和共享路径 for /f "tokens=1,2" %%d in ("%%a") do ( :: 检查当前共享是否属于目标服务器 echo "%%e" | findstr /i "%target_server%" >nul if !errorlevel! equ 0 ( :: 实际执行删除,/y参数跳过确认提示 net use %%d /del /y echo 已删除旧映射: %%d -> %%e ) ) ) :: 第二步:重新映射刚才删除的驱动器(复用原共享路径) echo. echo 正在创建新的网络驱动器映射... :: 重新扫描目标服务器的共享(如果需要固定映射,也可以直接写死路径) for /f "skip=1 tokens=1,2 delims=" %%a in ('wmic logicaldisk get Caption^, ProviderName ^| findstr /i /v "^$"') do ( for /f "tokens=1,2" %%d in ("%%a") do ( echo "%%e" | findstr /i "%target_server%" >nul if !errorlevel! equ 0 ( set "share_path=%%e" set "drive_letter=%%d" :: 用新密码重新映射,/persistent:yes让映射重启后保留(可选) net use !drive_letter! !share_path! /user:%domain_user% %new_pwd% /persistent:yes echo 已完成新映射: !drive_letter! -> !share_path! ) ) ) echo. echo 所有操作完成! pause endlocal
关键改进点说明:
- 真·执行删除命令:把原脚本的
echo net use %%a /del改成net use %%d /del /y,/y参数自动跳过删除确认,不用手动干预。 - 处理WMIC空行:用
findstr /i /v "^$"过滤掉WMIC输出里的空行,避免循环处理无效内容导致的错误。 - 延迟变量扩展:启用
setlocal enabledelayedexpansion解决循环内变量值不更新的问题,确保重新映射时能正确获取驱动器号和共享路径。 - 分步执行:先批量删完所有旧映射,再统一创建新映射,避免边删边建可能出现的资源冲突。
- 友好日志:每一步都有明确的提示信息,方便你排查执行情况。
简化版(如果共享路径固定):
要是你不需要动态扫描,而是知道固定的驱动器号和共享路径,可以用更简洁的版本:
@echo off set "drive=Z:" set "share=\\srv1\your_shared_folder" set "domain_user=dom/uid1" set "new_pwd=pwd" :: 先删除旧映射(即使不存在也不会报错) net use %drive% /del /y >nul 2>&1 :: 用新密码创建新映射 net use %drive% %share% /user:%domain_user% %new_pwd% /persistent:yes echo 已完成映射更新: %drive% -> %share% pause
内容的提问来源于stack exchange,提问作者AxelF
相关产品推荐
相关产品推荐

