2015-01-09 61 views
1

我有一個用於創建通過PHP日誌文件生成日期標記的文件名的批處理腳本。該文件名存儲在一個名爲logFile的windows批處理文件變量中。如何在Windows批處理腳本變量傳遞到管道命令

我想重用變量在我的發球管道但是命令似乎由管道創建的子命令不繼承或者從上下文中的父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 
+1

'tee'是不是原生批處理命令。你使用的是GnuWin32工具嗎? – SomethingDark

+0

是的,我使用[GnuWin32Tools](http://unxutils.sourceforge.net/)中的'tee.exe'命令。 [BatchTee](http://stackoverflow.com/questions/11239924/windows-batch-tee-command)也適用 – mark

回答

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命令將用於每個do子句中執行的代碼在執行化簡的輸出中。可更換參數(在這種情況下使用%%a)將保存正在處理的行的內容。

1

的問題是,這

SET logFile=| php -r "$d = new DateTime(); $dateString = $d->format('Ymd-His'); 
        echo 'C:\\temp\\logs\\' . $dateString . '-exec.log';" 

實際上並沒有做你想要的它;管道操作員將其分爲兩個命令,其中一個刪除logFile環境變量,另一個命令打印文件名。

%logFile% 

做什麼都沒有,因爲logFile沒有定義,因此擴展爲空字符串。

你認爲是從logFile擴張來輸出實際上是從前面的命令來了。

0

感謝您的評論哈利,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

相關問題