Отправить вывод файла журнала на консоль - PullRequest
1 голос
/ 21 октября 2019

У меня есть скрипт powershell, который запускает exe для установки фреймворка dotnet. Этот exe-файл не входит в консоль, но может войти в файл. Мне нужно увидеть журнал в нашем инструменте развертывания, который будет отображать консоль.

Я запускаю исполняемый файл так:

$process = Start-Process  "$exe" "/q /norestart /log $logFile" -passthru

Затем я отправляю содержимое файла журнала на консоль, какthis:

get-content $logFile -tail 5 -wait

Это работает, но скрипт никогда не заканчивается. -Wait продолжает ждать новых строк даже после того, как все сделано.

Я попытался запустить get-content как задание, используя Start-Job, но потом не могу получить вывод на консоль (так как этоработает).

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Если целевой файл не получен удален , Get-Content -Wait выполняется бесконечно (требуется нажать Ctrl + C для завершения).

Однако вы можете использовать фоновое задание [thread] для мониторинга файла журнала, в то время как цикл переднего плана используется для периодического сбора и отображения выходных данных задания. , через Receive-Job и выйдите из этого цикла после завершения процесса установки :

Следующий автономный код демонстрирует метод:

Примечание: я использую дочерний процессна основе Start-Job для создания фонового задания, но если вам доступен командлет
Start-ThreadJob , вы можете использовать его как более легкую альтернативу на основе потоков (Start-ThreadJob поставляется с PowerShell Core ; в Windows PowerShell вы можете установить его, например, с Install-Module ThreadJob -Scope CurrentUser.

$VerbosePreference = 'Continue'
$ErrorActionPreference = 'Stop'

Write-Verbose 'Starting installer process in the background.'
$ps = Start-Process -NoNewWindow -PassThru pwsh '-noprofile', '-command', 
  '$null > $HOME/test.log; 1..20 | % { $_ >> $HOME/test.log; Start-Sleep 1 }'

Write-Verbose 'Starting log-file monitoring job.'
# If Start-ThreadJob is available to you, you can use it instead of Start-Job here.
$jb = Start-Job { 
  while (-not (Test-Path $HOME/test.log)) { Start-Sleep 1 }
  Get-Content $HOME/test.log -Last 5 -Wait 
}

Write-Verbose 'Receiving job output while waiting for the installer process to exit...'
while (-not $ps.HasExited) {
  Receive-Job $jb
  Start-Sleep -Milliseconds 100
}

Write-Verbose 'Installer process has exited, removing job.'
Remove-Job $jb -Force

# Remove the sample log file.
Remove-Item $HOME/test.log

Предупреждение : К сожалению, Start-ThreadJobи Start-Job в настоящее время имеют собственное представление о текущем местоположении (рабочем каталоге), поэтомуst использовать полные пути ;это несоответствие будет исправлено в версии 7.0 не ранее .

Выше приведено:

VERBOSE: Starting installer process in the background.
VERBOSE: Starting log-file monitoring job.
VERBOSE: Receiving job output while waiting for the installer process to exit...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VERBOSE: Installer process has exited, removing job.
0 голосов
/ 21 октября 2019

Лучше всего подождать, пока установщик завершит работу. Затем вы можете прочитать содержимое файла журнала в консоль после завершения процесса. К сожалению, Get-Content не знает, когда завершается запись файла, который вы читаете, и требует от пользователя прекратить чтение, когда используется -Wait.

Если вы действительно хотите пройти через дополнительноеПри желании вы можете использовать Start-Job или Start-ThreadJob, как указано в ответе @ mklement0, чтобы запустить либо установщик, либо регистратор в фоновом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...