2013-04-03 1 views
0

Я пытаюсь перенаправить stdout на .\output\worker01.log и stderr на .\output\worker01-error.log. Это работает, если я запустить команду в оболочке:Перенаправление stdout и stderr в фоновом режиме в файлы в powershell

PS Q:\mles\etl-i_test> .\worker\bin\win32\php.exe -q -c .\worker\conf\php.ini .\worker\bin\os-independant\logfilefilter\logfilefilter.php -f .\worker\worker01\conf\logfilefilter-worker01.xml 2> .\output\worker01-error.log > .\output\worker01.log 

worker01.log и worker01-error.log записываются в выходной каталог.

Однако мне это нужно в сценарии powershell как несколько фоновых процессов. Могут быть n рабочих процессов, в моей тестовой папке 8 рабочих. Вот как я это называю:

$strPath = get-location 
$workers = get-childitem -Path worker -Filter worker* 
foreach ($worker in $workers) 
{ 
    Write-Host "Start $worker in background" 

    $block = {& $args[0] $args[1] $args[2] $args[3] $args[4] $args[5] $args[6] $args[7] $args[8] $args[9] $args[10]} 
    start-job -scriptblock $block -argumentlist ` 
    "$strPath\worker\bin\win32\php.exe", ` 
    "-q", ` 
    "-c", ` 
    "$strPath\worker\conf\php_win32.ini", ` 
    "$strPath\worker\bin\os-independant\logfilefilter\logfilefilter.php", ` 
    "-f", ` 
    "$strPath\worker\$worker\conf\logfilefilter-$worker.xml", ` 
    "2>", ` 
    "$strPath\output\$worker-error.log", ` 
    ">", ` 
    "$strPath\output\$worker.log" 
} 

Если я запустить сценарий, я могу видеть 8 PHP и процессы PowerShell нерест, который сразу же исчезают. В выходном каталоге нет файлов журналов.

ответ

1

Не помещайте символы переадресации (">" и "2>") в список аргументов. Они должны быть в скриптблоке.

$block = {& $args[0] $args[1] $args[2] $args[3] $args[4] $args[5] $args[6] 2> $args[7] > $args[8]} 
    start-job -scriptblock $block -argumentlist ` 
    "$strPath\worker\bin\win32\php.exe", ` 
    "-q", ` 
    "-c", ` 
    "$strPath\worker\conf\php_win32.ini", ` 
    "$strPath\worker\bin\os-independant\logfilefilter\logfilefilter.php", ` 
    "-f", ` 
    "$strPath\worker\$worker\conf\logfilefilter-$worker.xml", ` 
    "$strPath\output\$worker-error.log", ` 
    "$strPath\output\$worker.log" 

Это работает именно так.

+0

Вы только что ответили на свой вопрос? –

+1

Да, я так и сделал, так как я решил это тем временем. – mles