Batch file 在批处理文件中为循环设置未定义的变量
在批处理文件中,列出了任意数量的变量,有些已定义,有些未定义。如何在FOR循环或其他迭代方式中,将名称从“\u1”开始的未定义(未设置为任何值)变量设置为1 下面的代码只打印从“u”(下划线)开始的已定义变量,但不会将未定义变量设置为1Batch file 在批处理文件中为循环设置未定义的变量,batch-file,cmd,Batch File,Cmd,在批处理文件中,列出了任意数量的变量,有些已定义,有些未定义。如何在FOR循环或其他迭代方式中,将名称从“\u1”开始的未定义(未设置为任何值)变量设置为1 下面的代码只打印从“u”(下划线)开始的已定义变量,但不会将未定义变量设置为1 @echo off setlocal EnableExtensions EnableDelayedExpansion :Variables set "_A=good" & set "_B=" & set "C=" & set "D=6"
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:Variables
set "_A=good" & set "_B=" & set "C=" & set "D=6" & set "_E=bad"
set "_F=" & set "_G=ugly"
:Core
for /f "tokens=1,2 delims==" %%i in ('set _') do (
if "%%j"=="" set "%%i=1"
echo %%i %%j)
for /f "tokens=1,2 delims==" %%i in ('set _') do (
set "varn=%%i" & set "varp=%%j"
if not %%j equ 1 (echo %%i = %%j
) else (set /p "%%j=Enter %%i > " 2>nul)
)
call :verify !varn! !varp!
exit /b
:verify
rem More code
下面
:AllVariables
标签您必须定义所需的变量,但您的问题没有定义这样的方法!您可以从参数或文本文件中的一行中收集它们,或者…我更喜欢基于此处和其他地方的Aacini答案的组合解决方案。优点是,它不需要设置额外的:AllVariables节:
你认为什么是一个未定义的变量?在命令提示中键入
set“\u H=“
”,然后键入set
;那么,您希望显示什么?未定义的变量是那些已命名但未设置值的变量。我不希望它们在设置之前显示值。FOR循环的目的是将所有未定义的变量设置为1,即定义它们。如果一种迭代方法不正确,您可以建议另一种迭代方法吗?键入set“\u H=“
和set”
;您会发现,\u H
不显示;批处理中没有“命名”或定义的变量;一旦分配了非空值/字符串,就定义了一个变量,否则它将被清除,因此未定义;因此,您的for/F
循环仅迭代您之前设置的变量(\u A
,\u D
,\u E
,\u G
)。您的解释值得赞赏,但它并没有提供一种方法来解决以迭代方式将未定义变量设置为1的问题。因此,它没有回答我的上述问题。:)这就是为什么它是一个评论而不是答案…;-)一个可能的解决办法是:对于%%V in(\u A\u B\u C\u D\u E\u F\G),如果未定义%%V set“%%V=1”
…什么代码允许将:变量部分中存在的未定义变量收集到:AllVariables部分?我假设这样的代码示例会给出一个提示,如何在:AllVariables部分添加来自其他源(如批处理参数和args文件)的未定义变量。:)请注意,有哪些有效的技术可以将代码处理限制在特定的代码部分,如:变量?当然,GOTO或函数是已知的示例。可以使用set“variables=!variables!%%i”
技术从其他源添加变量,但从:variables部分收集变量的方法目前尚不清楚。当然,如果无法编码,也可以手动完成。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:Variables
set "_A=good" & set "_B=" & set "C=" & set "D=6" & set "_E=bad"
set "_F=" & set "_G=ugly"
:AllVariables
rem You must define here a list with "all variables"
set "variables=_A _B C D _E _F _G"
:Core
for %%v in (%variables%) do if not defined %%v set "%%v=1"
exit /b
@echo off
setlocal EnableDelayedExpansion
:Variables
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly"
set "C=" & set D=6
:Core
set "uars=,!vars!," & set "uars=!uars:,=" "!" & set "uars=!uars:~2,-2!"
for %%u in (!uars!) do (
for /f "tokens=1,2 delims==" %%v in (%%u) do (
if not %%w.==. (set %%v=1) else set %%v=%%w
echo %%v=!%%v!))
:: Restore default _vars values if needed
set "%vars:,=" & set "%"
exit /b
:: Output
_A=good
_B=1
_E=bad
_F=1
_G=ugly