簡體   English   中英

如何將Windows批處理腳本變量傳遞給管道命令

[英]How to pass a windows batch script variable to a piped command

我有一個批處理腳本,該腳本會生成一個帶日期戳的文件名,以便通過php創建日志文件。 該文件名存儲在Windows批處理文件變量logFile中。

我想在我的管道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\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM