2015-01-09 1 views
1

PHP를 통해 로그 파일을 만들기위한 날짜 스탬프 파일 이름을 생성하는 배치 스크립트가 있습니다. 이 파일 이름은 logFile이라는 Windows 배치 파일 변수에 저장됩니다.Windows 배치 스크립트 변수를 파이프 된 명령에 전달하는 방법

내 파이프 티 (pipe) 티 명령에서 변수를 다시 사용하고 싶습니다. 그러나 파이프에 의해 생성 된 하위 명령이 컨텍스트에서 부모 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' 네이티브 배치 명령되지 않습니다 : 쉘 변수에 명령의 출력을 추가하면

:: 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% 

나는 또한뿐만 아니라이 답변에서 몇 가지 정보를 함께 조합해서 : 매우 직관적되지 않습니다 . GnuWin32 도구를 사용하고 있습니까? – SomethingDark

+0

예 [GnuWin32Tools] (http://unxutils.sourceforge.net/)의'tee.exe' 명령을 사용하고 있습니다. [BatchTee] (http://stackoverflow.com/questions/11239924/windows-batch-tee-command)도 작동합니다. – mark

답변

1

는 변수로 명령을 실행하고 그 결과를 검색하기 위해 "적절한"방법은 for 명령 각각에 대한 do 절에서 코드를 실행

@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 /f 명령을 사용하는 것이다 실행 comamnd의 출력 라인. 교체 가능한 매개 변수 (이 경우 %%a이 사용됨)는 처리중인 행의 내용을 보유합니다.

1

문제는이

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

은 실제로 당신이 원하는 일을하지 않는다는 것입니다 그것에; pipe 연산자는 그것을 두 개의 명령으로 나눕니다. 그 중 하나는 logFile 환경 변수를 삭제하고 다른 하나는 파일 이름을 인쇄합니다.

%logFile% 

은 빈 문자열로 확장 따라서 logFile가 정의되어 있지 않기 때문에, 전혀 아무것도하지 않고.

logFile의 확장에서 오는 출력은 실제로 이전 명령에서 나옵니다. 배치 파일

관련 문제