我有一个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作为作业运行,但是后来我无法获得输出到控制台(因为它正在运行)。
有什么想法吗?
答案 0 :(得分:0)
此处最好的做法是等待安装程序完成。然后,您可以在进程退出后将日志文件内容读入控制台。不幸的是,Get-Content
不知道何时完成您正在读取的文件的写入,并且要求用户在使用-Wait
时终止读取。
如果您真的想付出更多的努力,可以使用@ mklement0的答案中的Start-Job
或Start-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-ThreadJob
和Start-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.