CMD批处理脚本中找到元素赋值给变量后如何从数组中删除该元素
Batch脚本实现自动分配可用盘符并移除已分配项解决方案
实现思路
- 核心通过字符串替换的方式将已分配的盘符从盘符数组中移除,不需要额外遍历数组
- 注意变量替换在for循环中需要开启延迟变量扩展,避免预读取导致的替换失效
完整可运行代码
@echo off setlocal enabledelayedexpansion :: 初始化所有可选盘符数组 set "DriveArray=c d e f g h i j k l m n o p q r s t u v w x y z" :: 分配第一个可用盘符给SYS变量 for %%S in (!DriveArray!) do ( if not exist %%S:\ ( set SYS=%%S :: 从数组中移除已分配的盘符,前后加空格避免匹配到其他盘符字符串 set "DriveArray=!DriveArray: %%S = !" goto end_get_sys ) ) :end_get_sys :: 分配第二个可用盘符给DATA变量 for %%D in (!DriveArray!) do ( if not exist %%D:\ ( set DATA=%%D set "DriveArray=!DriveArray: %%D = !" goto end_get_data ) ) :end_get_data :: 给盘符补冒号后缀 set SYS=%SYS%: set DATA=%DATA%: echo 分配后的盘符数组为 %DriveArray% echo SYS盘被赋值为 %SYS% echo DATA盘被赋值为 %DATA% pause endlocal
关键说明
- 开启延迟扩展是本方案生效的核心前提,
setlocal enabledelayedexpansion可以让for循环内部实时读取变量的最新修改值,否则脚本会预读取所有变量值,循环内修改的数组不会生效 - 字符串替换时在盘符前后加空格,是为了避免匹配错误,比如要移除
c盘符时,不会误修改其他包含c的盘符字符串 - 每次匹配到可用盘符后用
goto跳出循环,既可以避免无效遍历,也能确保只取第一个符合要求的可用盘符
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

