Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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

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
Variables 如何在批处理的变量中存储变量?_Variables_Batch File - Fatal编程技术网

Variables 如何在批处理的变量中存储变量?

Variables 如何在批处理的变量中存储变量?,variables,batch-file,Variables,Batch File,我试图将一组串联的变量存储到一个新设置的变量中。当我将一个变量添加到另一个变量中时,它似乎并没有被正确设置。我很好奇BATCH是否可以在变量中存储变量,或者我是否必须在现有的格式之外进行格式化: 示例:“oldDirectory”变量应显示与“%progdata%\%datetime%”相同的内容 尝试: CALL SET oldDirectory="%progdata%\%datetime%" CALL ECHO %oldDirectory% 尝试: CALL SET oldDirector

我试图将一组串联的变量存储到一个新设置的变量中。当我将一个变量添加到另一个变量中时,它似乎并没有被正确设置。我很好奇BATCH是否可以在变量中存储变量,或者我是否必须在现有的格式之外进行格式化:

示例:“oldDirectory”变量应显示与
“%progdata%\%datetime%”相同的内容

尝试:

CALL SET oldDirectory="%progdata%\%datetime%"
CALL ECHO %oldDirectory%
尝试:

CALL SET oldDirectory="%progdata%\%datetime%"
CALL ECHO %oldDirectory%
第一种方法:

IF EXIST  "%progdata%" ( 
echo Found  %progdata%
SET oldDirectory="%%progdata%%\%%datetime%%"
call echo %oldDirectory%
) 
第二种方法:

IF EXIST  "%progdata%" ( 
echo Found  %progdata%
SET oldDirectory="!progdata!\!datetime!"
setlocal EnableDelayedExpansion
echo %oldDirectory%
) 
有趣的一点是,
echo%oldDirectory%
命令显示
progdata
datetime
变量的当前值,这些变量的值与
oldDirectory
的值相同

编辑:添加示例

输出:

First method:
"C:\ProgramData\14082013_211303.20"
Second method:
"C:\ProgramData\14082013_211303.21"
第一种方法:

IF EXIST  "%progdata%" ( 
echo Found  %progdata%
SET oldDirectory="%%progdata%%\%%datetime%%"
call echo %oldDirectory%
) 
第二种方法:

IF EXIST  "%progdata%" ( 
echo Found  %progdata%
SET oldDirectory="!progdata!\!datetime!"
setlocal EnableDelayedExpansion
echo %oldDirectory%
) 
有趣的一点是,
echo%oldDirectory%
命令显示
progdata
datetime
变量的当前值,这些变量的值与
oldDirectory
的值相同

编辑:添加示例

输出:

First method:
"C:\ProgramData\14082013_211303.20"
Second method:
"C:\ProgramData\14082013_211303.21"

您有一个标准的
延迟扩展
问题,一直在讨论

当批处理遇到一个
“Block statement”
——通常是一个括号内的语句,分布在许多行上,如
IF EXIST
,则整个语句被解析为右括号,此时,解析语句时,任何
%var%
都将替换为该变量的值

因此,,您的
ECHO%olddirectory%
ECHO
替换,因为
olddirectory
在解析时没有值,执行
ECHO
将报告
ECHO打开/关闭
progdata
另一方面在解析时设置,因此
ECHO找到了%progdata%
是替换为
echo找到C:\ProgramData

最简单的解决方法是将
ECHO
语句移出

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
)
echo Olddirectory=%oldDirectory%
(我添加了
olddirectory=
,以便
echo
语句在未设置
olddirectory
时找到要回显的内容)

显示值的第二种最简单的方法是

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
 CALL echo %%oldDirectory%%
)
这里,
ECHO
命令不是在
IF
的上下文中展开的,而是在
调用的上下文中展开的,该调用从
IF
上下文的运行时值获取其环境

第三种显示值的最简单方法是使用
setlocal
命令的
delayedexpansion
选项。NT批处理命令通常会启动

@echo off
setlocal
这将抑制
回音
,并建立本地环境。当在
setlocal
的上下文中到达
endlocal
或文件结尾时,对本地环境的任何更改都将被撤消。如果一直遵循这个咒语,我们就不会出现这样的情况:一个批次建立了一个变量,而下一个批次的环境是“脏的”。考虑在相同的<代码> CMD会话中运行原来的两次。code>progdata
,以及您正在建立的所有其他变量将在第二次调用时保持设置状态,因此,
olddirectory
可能会在您的第一次调用时设置,如果出于某种原因未在第二次调用中显式设置,则会保留该陈旧数据
setlocal
为您备份所有这些更改

setlocal enabledelayedexpansion
为混合添加了一个额外的功能。鉴于
%var%
解析为
var
PARSE-TIME值,如果调用了
delayedexpansion
,则
!瓦尔解析为运行时的值-因为它在
FOR
循环中发生变化

因此,加入

SETLOCAL ENABLEDELAYEDEXPANSION
在一个关键点(在
@echo off
之后,直到你离开训练轮…)将允许你对
旧目录的显示进行简单的更改

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
 echo !oldDirectory!
) 

您有一个标准的
延迟扩展
问题,一直在讨论

当批处理遇到一个
“Block statement”
——通常是一个括号内的语句,分布在许多行上,如
IF EXIST
,则整个语句被解析为右括号,此时,解析语句时,任何
%var%
都将替换为该变量的值

因此,,您的
ECHO%olddirectory%
ECHO
替换,因为
olddirectory
在解析时没有值,执行
ECHO
将报告
ECHO打开/关闭
progdata
另一方面在解析时设置,因此
ECHO找到了%progdata%
是替换为
echo找到C:\ProgramData

最简单的解决方法是将
ECHO
语句移出

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
)
echo Olddirectory=%oldDirectory%
(我添加了
olddirectory=
,以便
echo
语句在未设置
olddirectory
时找到要回显的内容)

显示值的第二种最简单的方法是

IF EXIST  "%progdata%" ( 
 echo Found  %progdata%
 SET oldDirectory="%progdata%\%datetime%"
 CALL echo %%oldDirectory%%
)
这里,
ECHO
命令不是在
IF
的上下文中展开的,而是在
调用的上下文中展开的,该调用从
IF
上下文的运行时值获取其环境

第三种显示值的最简单方法是使用
setlocal
命令的
delayedexpansion
选项。NT批处理命令通常会启动

@echo off
setlocal
这将抑制
回音
,并建立本地环境。当在
setlocal
的上下文中到达
endlocal
或文件结尾时,对本地环境的任何更改都将被撤消。如果这句咒语一直被遵守,我们就不需要了