在批处理文件中列出了任意数量的变量,其中一些是已定义的,另一些则未定义。如何在FOR循环或其他迭代方式中将名称从“_”开始的未定义(未设置为任何值)变量设置为?
下面的代码只打印从“_”(下划线)开始的已定义变量,但它不会将未定义的变量设置为1.
@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
答案 0 :(得分:3)
@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
在:AllVariables
标签下方,您必须定义所需的变量,但您的问题未定义了这样的方法!您可以从参数或文本文件中的一行收集它们,或者......
答案 1 :(得分:-2)
我更喜欢基于Aacini在这里和其他地方的答案的综合解决方案。优点是,它不需要设置额外的:AllVariables 部分:
@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