簡體   English   中英

Powershell: system-diagnostics-processstartinfo 掛起,原因未知

[英]Powershell: system-diagnostics-processstartinfo hangs, reason unknown

深受 Stackoverflow 上其他問題的影響,我最終使用這種方法從我的 Powershell 腳本啟動進程

function global:system-diagnostics-processstartinfo {
[CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Low')]
param
(
    [Parameter(Mandatory=$True,HelpMessage='Full path to exectuable')]
    [Alias('exectuable')]
    [string]$exe,
    [Parameter(Mandatory=$True,HelpMessage='All arguments to be sent to exectuable')]
    [Alias('args')]
    [string]$arguments
)

if (!(Test-Path $exe)) {
    $log.errorFormat("Did not find exectuable={0}, aborting script", $exe)
    exit 1  
}

$log.infoFormat("Start exectuable={0} with arguments='{1}'", $exe, $arguments)
$processStartInfo = New-Object System.Diagnostics.ProcessStartInfo($exe)
$processStartInfo.FileName = $exe
$processStartInfo.RedirectStandardError = $true
$processStartInfo.RedirectStandardOutput = $true
$processStartInfo.UseShellExecute = $false
$processStartInfo.Arguments = $arguments
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $processStartInfo
$log.info("Start exectuable and wait for exit")
$p.Start() | Out-Null

#$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
$log.infoFormat("exectuable={0}  stdout: {1}", $exe, $stdout)
$log.debugFormat("exectuable={0} stderr: {1}",  $exe,$stderr)
$global:ExitCode = $p.ExitCode
$log.debugFormat("exectuable={0} Exitcode: {1}", $exe, $p.ExitCode)

return $stdout
}

非常簡單,添加了一些日志記錄等。它適用於我當前的所有用例,但不包括一個。 我創建了一個腳本,用於將我們的 Confluence 生產實例的數據庫轉儲復制到我們的測試服務器。 然后它使用上述方法刪除現有數據庫,一切正常。 但實際的恢復只是永遠掛起。 所以現在我必須退出腳本,然后手動運行以下命令

d:\postgresql\bin\pg_restore.exe -U postgres -d confluencedb -v -1 d:\temp\latest-backup.pgdump

這需要一些時間,並且有很多 output。這讓我相信一定有以下任何一個導致問題

  • output 的數量使緩沖區溢出並停止腳本
  • 這需要很多時間

哪位有類似經歷的可以幫我解決一下。 它將能夠安排導入,而不必像今天那樣手動執行。

我必須在處理后立即執行以下操作。 開始:

# Capture output during process execution so we don't hang
# if there is too much output.
do
{
    if (!$process.StandardOutput.EndOfStream)
    {
        [void]$StdOut.AppendLine($process.StandardOutput.ReadLine())
    }
    if (!$process.StandardError.EndOfStream)
    {
        [void]$StdErr.AppendLine($process.StandardError.ReadLine())
    }

    Start-Sleep -Milliseconds 10
}
while (!$process.HasExited)
        
# Capture any standard output generated between our last poll and process end.
while (!$process.StandardOutput.EndOfStream)
{
    [void]$StdOut.AppendLine($process.StandardOutput.ReadLine())
}
    
# Capture any error output generated between our last poll and process end.
while (!$process.StandardError.EndOfStream)
{
    [void]$StdErr.AppendLine($process.StandardError.ReadLine())
}

# Wait for the process to exit.
$process.WaitForExit()
LogWriteFunc ("END process: " + $ProcessName)

if ($process.ExitCode -ne 0)
{
    LogWriteFunc ("Error: Script execution failed: " + $process.ExitCode )
    $FuncResult = 1
}

# Log and display any standard output.
if ($StdOut.Length -gt 0)
{
    LogWriteFunc ($StdOut.ToString())
}
    
# Log and display any error output.
if ($StdErr.Length -gt 0)
{
    LogWriteFunc ($StdErr.ToString())
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM