将日志文件输出发送到控制台

时间:2019-10-21 17:20:15

标签: .net powershell

我有一个Powershell脚本,该脚本运行一个exe来安装dotnet框架。该exe不会登录到控制台,但可以登录到文件。我需要在我们的部署工具中查看日志,该日志将显示控制台。

我这样运行exe:

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

然后我将日志文件的内容发送到控制台,如下所示:

get-content $logFile -tail 5 -wait

这有效,但是脚本永远不会结束。即使完成所有操作,-wait仍在等待新行。

我尝试使用Start-Job将get-content作为作业运行,但是后来我无法获得输出到控制台(因为它正在运行)。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

此处最好的做法是等待安装程序完成。然后,您可以在进程退出后将日志文件内容读入控制台。不幸的是,Get-Content不知道何时完成您正在读取的文件的写入,并且要求用户在使用-Wait时终止读取。

如果您真的想付出更多的努力,可以使用@ mklement0的答案中的Start-JobStart-ThreadJob在后​​台运行安装程序或记录器。

答案 1 :(得分:0)

除非目标文件被删除 ,否则Get-Content -Wait将无限期运行 (需要按 Ctrl + C 终止)。

但是,您可以使用后台[线程]作业来监视日志文件,同时使用前景循环来定期收集和显示作业的输出,通过Receive-Job并在安装程序退出后退出该循环

以下独立代码演示了该技术:

注意:我正在使用基于子进程的Start-Job来创建后台作业,但是如果您可以使用
Start-ThreadJob cmdlet,则可以将其用作更多内容。轻量级,基于线程的替代方法(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-ThreadJobStart-Job当前有自己的想法,即当前位置(工作目录)是什么,因此最好使用完整路径;这个inconsistency will be fixed, in v7.0 at the earliest

以上结果:

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.