批处理函数中无法通过数组索引打印选中盘符的问题排查
批处理脚本中HASH函数无法打印选中盘符的原因及解决办法
问题描述
我写了三个批处理函数:
list_disk:通过wmic获取盘符列表并存储到数组nom中choix:让用户选择需要处理的盘符,若用户输入y则调用HASH函数HASH:处理选中盘符的指纹,但其中的echo !nom[%%i]!无法正常打印选中的盘符,请问这是为什么?
原代码
REM list the drives :list_disk ECHO List of drives set n=0 for /f "skip=1 delims=" %%a in ('wmic logicaldisk get DeviceID^') do ( set nom[!n!]=%%a set /A n+=1 ) set /A "N=%n%/2" FOR /L %%i IN (0,1,%N%) DO ( echo !nom[%%i]! echo/ ) EXIT /B 0 REM choice of drives :choix nom echo Choice FOR /L %%i IN (0,1,%N%) DO ( echo Do you want to raise the drive !nom[%%i]! echo (y/n) ? SET c=n SET /P c= if !c!==y call :HASH i ) EXIT /B 0 REM fingerprinting :HASH ECHO Fingerprinting in progress ... echo !nom[%%i]! ECHO progam integration fingerprint : EXIT /B 0
原因分析
- 参数传递错误:调用
HASH时传的是i而非循环变量%%i的实际值,%%i是:choix中FOR循环的局部变量,HASH函数无法直接访问这个变量。 - 函数参数接收方式错误:
HASH里用echo !nom[%%i]!是无效写法,批处理函数需要通过%1、%2这类位置参数接收外部传递的值,不能直接使用调用方的循环变量。 - 标签语法错误:
:choix nom是无效写法,批处理标签不能附带参数,直接写:choix即可。
解决办法
- 修正参数传递:在
:choix的循环中,调用HASH时传递循环变量的实际值:call :HASH %%i - 修改HASH函数的变量引用:在
HASH函数中用%1接收传递的索引,再通过!nom[%1]!访问数组元素(需确保脚本开启延迟扩展) - 修正标签语法:将
:choix nom改为:choix - 开启延迟扩展:脚本开头添加
@echo off & setlocal enabledelayedexpansion,否则数组变量!nom[xxx]!无法正常解析
修正后的完整代码
@echo off setlocal enabledelayedexpansion call :list_disk call :choix endlocal exit /b REM list the drives :list_disk ECHO List of drives set n=0 for /f "skip=1 delims=" %%a in ('wmic logicaldisk get DeviceID^') do ( rem 过滤wmic输出的空行 if not "%%a"=="" ( set nom[!n!]=%%a set /A n+=1 ) ) set /A N=n-1 FOR /L %%i IN (0,1,%N%) DO ( echo !nom[%%i]! echo/ ) EXIT /B 0 REM choice of drives :choix echo Choice FOR /L %%i IN (0,1,%N%) DO ( echo Do you want to process the drive !nom[%%i]! echo (y/n) ? SET c=n SET /P c= rem 不区分大小写判断输入 /i if "!c!"=="y" call :HASH %%i ) EXIT /B 0 REM fingerprinting :HASH ECHO Fingerprinting in progress ... echo Processing drive: !nom[%1]! ECHO Program integration fingerprint : EXIT /B 0
内容的提问来源于stack exchange,提问作者akmot
相关产品推荐
相关产品推荐

