如何将 windows 批处理脚本变量传递给管道命令
How to pass a windows batch script variable to a piped command
我有一个批处理脚本,可以生成带有日期戳的文件名,用于通过 php 创建日志文件。该文件名存储在名为 logFile 的 windows 批处理文件变量中。
我想在我的管道 tee 命令中重用该变量,但管道创建的子命令似乎没有继承或在上下文中没有来自父 cmd 控制台的变量。
谁能展示如何在不使用临时文件或创建另一个批处理脚本的情况下解决这个问题?
谢谢!
execJobs.bat
@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\logs150109-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\logs150109-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
扩展的输出实际上来自上一个命令。
在批处理文件中,"proper" 执行命令并将其输出检索到变量中的方法是使用 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
命令将执行命令输出中每一行的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 batch assign output of a program to a variable
我有一个批处理脚本,可以生成带有日期戳的文件名,用于通过 php 创建日志文件。该文件名存储在名为 logFile 的 windows 批处理文件变量中。
我想在我的管道 tee 命令中重用该变量,但管道创建的子命令似乎没有继承或在上下文中没有来自父 cmd 控制台的变量。
谁能展示如何在不使用临时文件或创建另一个批处理脚本的情况下解决这个问题?
谢谢!
execJobs.bat
@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\logs150109-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\logs150109-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
扩展的输出实际上来自上一个命令。
在批处理文件中,"proper" 执行命令并将其输出检索到变量中的方法是使用 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
命令将执行命令输出中每一行的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 batch assign output of a program to a variable