如何在Batch中的变量中存储变量?

时间:2013-08-14 16:51:24

标签: variables batch-file

我试图将一组连接的变量存储到一个新的SET变量中。当我将变量添加到另一个变量时,它实际上似乎没有正确设置。我很好奇BATCH是否可以在变量中存储变量,或者我是否必须进行格式化,而不是我现在的格式:

示例:'oldDirectory'变量应显示与"%progdata%\%datetime%"

相同的内容
@echo off

For /f "tokens=2-4 delims=/ " %%a in ("%DATE%") do (
    SET YYYY=%%c
    SET MM=%%a
    SET DD=%%b
)
For /f "tokens=1-3 delims=/:." %%a in ("%TIME%") do (
    SET HH24=%%a
    SET MI=%%b
    SET SS=%%c
)

SET datetime=%YYYY%%MM%%DD%_%HH24%%MI%%SS%
SET progdata=C:\ProgramData

@echo on    

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

3 个答案:

答案 0 :(得分:2)

尝试:

CALL SET oldDirectory="%progdata%\%datetime%"
CALL ECHO %oldDirectory%

答案 1 :(得分:2)

第一种方法:

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%命令显示 progdatadatetime变量的当前值相同值 oldDirectory

编辑已添加示例

@echo off

set progdata=C:\ProgramData

echo First method:
SET oldDirectory="%%progdata%%\%%date:/=%%_%%time::=%%"
call echo %oldDirectory%

echo Second method:
SET oldDirectory="!progdata!\!date:/=!_!time::=!"
setlocal EnableDelayedExpansion
echo %oldDirectory%

输出:

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

答案 2 :(得分:1)

您有一个标准的DELAYED EXPANSION问题,在SO上无休止地讨论。

当批处理遇到"Block statement"时 - 这通常是括号内的语句,分布在诸如IF EXIST之类的许多行上,那么整个语句将被解析为右括号AND此时,ANY {{ 1}}被该变量的值替换为当声明分散

因此,%var%已替换为ECHO %olddirectory%,因为ECHO没有值 AT PARSE TIME ,执行olddirectory将报告{{1}另一方面,ECHO IS 在分析时设置,因此ECHO is On/Off替换为progdata

最简单的方法是将echo Found %progdata%语句移到echo Found C:\ProgramData

之外
ECHO

(我添加了block,以便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的运行时值获取其环境。 {1}}上下文。

显示该值的第三种最简单方法是使用CALL命令的IF选项。传统上,NT批处理命令启动

delayedexpansion

抑制setlocal并建立本地环境。在@echo off setlocal 的上下文中到达echoing或文件结尾时,将撤消对本地环境的任何更改。如果始终遵循这个咒语,我们就不会遇到一个批次建立变量而下一个环境“脏”的情况。考虑在同一endlocal会话中运行原始文件两次。 setlocal,您正在建立的所有其他变量将保留为第二次调用 - 因此cmd可能会由您的第一次调用设置,并保留该陈旧数据,如果由于某种原因它不是显式的设置在第二个。 progdata为您支持所有这些更改。

olddirectory为混音添加了额外的设施。鉴于setlocal已解析为setlocal enabledelayedexpansion PARSE-TIME 值,如果已调用%var%,则var将解析为 RUN-TIME 值 - 因为它在delayedexpansion循环中发生变化...

因此,添加

!var!

在战略要点(FOR之后,直到您离开训练轮......)将允许您对SETLOCAL ENABLEDELAYEDEXPANSION 的显示进行简单的更改

@echo off