我试图将一组连接的变量存储到一个新的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
答案 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%
命令显示 progdata
和datetime
变量的当前值且相同值 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