我有一个批处理脚本,它生成一个带日期戳的文件名,用于通过php创建日志文件。该文件名存储在名为logFile的Windows批处理文件变量中。
我想在我的管道tee命令中重用该变量,但是管道创建的子命令似乎不会继承或从上级的父cmd控制台获取变量。
任何人都可以展示如何在不使用临时文件或创建其他批处理脚本的情况下解决此问题吗?
谢谢!
@echo off
SET logFile=| php -r "$d = new DateTime(); $dateString = $d->format('Ymd-His');
echo 'C:\\temp\\logs\\' . $dateString . '-exec.log';"
:: this is Ok
:: outputs c:\temp\logs\20150109-111031-exec.bat
%logFile%
:: This doesn't work
:: %logFile% in subCmd process is empty
:: how to inherit or pass environment/variable context to child processes?
call execJobs.bat | tee %logFile%
:: workaround, this doesn't work either
:: %logFile% is still empty in move command
:: call execJobs.bat | tee tmp
:: move /Y tmp %logFile%
:: del /F /Q tmp
C:\temp\logs\20150109-114443-exec.log
execJobs.bat | tee
答案 0 :(得分:1)
问题是这个
SET logFile=| php -r "$d = new DateTime(); $dateString = $d->format('Ymd-His');
echo 'C:\\temp\\logs\\' . $dateString . '-exec.log';"
实际上并不是你想要的;管道运算符将它分为两个命令,其中一个命令删除logFile
环境变量,另一个命令打印文件名。
此
%logFile%
什么都不做,因为logFile
未定义,因此扩展为空字符串。
您认为来自logFile
扩展的输出实际上来自上一个命令。
答案 1 :(得分:1)
在批处理文件中,"正确"执行命令并将其输出检索到变量的方法是使用for /f
命令
@echo off
setlocal enableextensions disabledelayedexpansion
set "logFile="
for /f "usebackq" %%a in (`
php -r "$d=new DateTime(); echo $d->format('Ymd-His');"
`) do set "logFile=C:\temp\logs\%%a-exec.log"
echo %logFile%
for
命令将执行执行comamnd输出中每一行的do
子句中的代码。可替换参数(在这种情况下使用%%a
)将保存正在处理的行的内容。
答案 2 :(得分:0)
感谢Harry的评论,MC你打败了我,发布了解决方案。那讲得通。如果其他人有兴趣,这是解决方案。将命令的输出添加到shell变量不是很直观:)
:: this command places the output from the php script into a shell variable: logFile
for /f %%i in ('php -r "$d = new DateTime(); $dateString = $d->format('Ymd-His');
echo 'C:\\temp\\logs\\' . $dateString . '-exec.log';"') do set logFile=%%i
echo Logging execJobs.bat output to: %logFile%
echo.
call execJobs.bat | tee %logFile%
我还将这个答案中的一些信息拼凑在一起: Windows batch assign output of a program to a variable