[英]How to pass a windows batch script variable to a piped command
我有一个批处理脚本,该脚本会生成一个带日期戳的文件名,以便通过php创建日志文件。 该文件名存储在Windows批处理文件变量logFile中。
我想在我的管道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
问题是
SET logFile=| php -r "$d = new DateTime(); $dateString = $d->format('Ymd-His');
echo 'C:\\temp\\logs\\' . $dateString . '-exec.log';"
实际上并没有做您想要的; 管道运算符将其分为两个命令,其中一个命令删除logFile
环境变量,而另一个则打印文件名。
这个
%logFile%
根本不执行任何操作,因为未定义logFile
,因此扩展为空字符串。
您认为来自logFile
扩展的输出实际上来自先前的命令。
在批处理文件中,执行命令并将其输出检索到变量中的“正确”方法是使用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
命令将对execute comamnd输出中的每一行执行do
子句中的代码。 可替换参数(在这种情况下使用%%a
)将保存正在处理的行的内容。
感谢您的评论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批处理将程序的输出分配给变量
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.