Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在批处理文件中为循环设置未定义的变量_Batch File_Cmd - Fatal编程技术网

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

Batch 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"

在批处理文件中,列出了任意数量的变量,有些已定义,有些未定义。如何在FOR循环或其他迭代方式中,将名称从“\u1”开始的未定义(未设置为任何值)变量设置为1

下面的代码只打印从“u”(下划线)开始的已定义变量,但不会将未定义变量设置为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

下面
: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