如何使用错误抑制或输出重定向来防止 set 命令在变量不存在时输出提示信息?
在 Windows 11 Pro(专业版)中,我正在编写一个 cmd.exe 的批处理子程序,用来清除名称以传入子程序的名字开头的变量,其用法如下:
以下是子程序的调用方式及参数:
call :CLEAR-PSEUDO-ARRAY args args2 args3
以下是该子程序中的相关语句:
:CLEAR-PSEUDO-ARRAY
@setlocal enabledelayedexpansion
set array-name=%1
for /f %%a in ( 'set !array-name![' ) do (
echo a = %%a
)
endlocal
exit /b 0
在子程序中,我使用 for-语句读取由 call 命令返回的所有变量名称,这些名称以传入的名字开头。
然而,如果某个 array-name 的元素不存在,则会显示以下错误,特别是针对 args3:
Environment variable args3[ not defined
我尝试通过将错误输出重定向到 NUL: 来隐藏错误,如下所示:
(for /F %a in ('set !array-name![') do @echo a = %a ) 2>NUL:
错误没有显示,但回显输出也没有。我也尝试在实际调用 set 语句时进行重定向,但出现了这个错误:
2> was unexpected at this time.
> for /f %a in ( 'set !array-name![ 2>NUL:' ) do @echo ^a = %a
在调用此子程序时,传入的伪数组基名(如 args 和 args3)可能并不存在(如 args3[1] 尚不存在),因此会发生错误,但为了在仍然看到 echo 语句输出的同时避免该错误,可以对名称进行预先存在性测试,但这存在问题,因为已定义的元素具有随机索引,所以在 set 找到它们之前,实际的变量名并不知晓。或者,可以让 set 获取所有现有变量名并进行匹配,但会有大量不必要的变量需要遍历。仅仅限制为指定参数名的首字母也会遇到我想解决的不存在错误。
我该如何使用错误抑制或输出重定向来解决这个问题?
解决方案
你必须在 in (...) 内对特殊字符进行转义:
for /f %a in ( 'set !array-name![ 2^>NUL:' ) do @echo a = %a
应该能奏效。
之所以你的第一段代码没有执行 echo,是因为 set 命令没有返回输出(STDOUT),所以循环不会执行。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。