在批处理文件FOR循环中设置未定义的变量

时间:2016-07-12 11:35:40

标签: batch-file cmd

在批处理文件中列出了任意数量的变量,其中一些是已定义的,另一些则未定义。如何在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

2 个答案:

答案 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