QUAN TRỌNG:
Chúng tôi đã sử dụng chức năng như được cung cấp ở trên bởi LPG .
Tuy nhiên, điều này có một lỗi bạn có thể gặp phải khi bắt đầu một quy trình tạo ra nhiều kết quả đầu ra. Do đó, bạn có thể gặp bế tắc khi sử dụng chức năng này. Thay vào đó, hãy sử dụng phiên bản đã điều chỉnh bên dưới:
Function Execute-Command ($commandTitle, $commandPath, $commandArguments)
{
Try {
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $commandPath
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = $commandArguments
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
[pscustomobject]@{
commandTitle = $commandTitle
stdout = $p.StandardOutput.ReadToEnd()
stderr = $p.StandardError.ReadToEnd()
ExitCode = $p.ExitCode
}
$p.WaitForExit()
}
Catch {
exit
}
}
Thông tin thêm về vấn đề này có thể được tìm thấy tại MSDN :
Điều kiện deadlock có thể xảy ra nếu tiến trình mẹ gọi p.WaitForExit trước p.StandardError.ReadToEnd và tiến trình con viết đủ văn bản để lấp đầy luồng được chuyển hướng. Tiến trình cha sẽ đợi vô thời hạn cho tiến trình con thoát. Tiến trình con sẽ đợi vô thời hạn để cha mẹ đọc từ luồng StandardError đầy đủ.
$process= ping localhost
# sẽ lưu kết quả đầu ra trong biến process.