Variables 如何在批处理的变量中存储变量?
我试图将一组串联的变量存储到一个新设置的变量中。当我将一个变量添加到另一个变量中时,它似乎并没有被正确设置。我很好奇BATCH是否可以在变量中存储变量,或者我是否必须在现有的格式之外进行格式化: 示例:“oldDirectory”变量应显示与Variables 如何在批处理的变量中存储变量?,variables,batch-file,Variables,Batch File,我试图将一组串联的变量存储到一个新设置的变量中。当我将一个变量添加到另一个变量中时,它似乎并没有被正确设置。我很好奇BATCH是否可以在变量中存储变量,或者我是否必须在现有的格式之外进行格式化: 示例:“oldDirectory”变量应显示与“%progdata%\%datetime%”相同的内容 尝试: CALL SET oldDirectory="%progdata%\%datetime%" CALL ECHO %oldDirectory% 尝试: CALL SET oldDirector
“%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
或文件结尾时,对本地环境的任何更改都将被撤消。如果这句咒语一直被遵守,我们就不需要了