PowerShell: System.Diagnostics.Process需要永远运行



我有一个PowerShell脚本,基本功能是运行curl.exe将文件从远程ftp服务器复制到本地。首先,我使用以下代码运行curl.exe:

$curlPath = "curl.exe"
$curlArgs = "sftp://download.url.com/filename_20220618.zip --user username:psw -o D:filename_20220618.zip -k"
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $curlPath
$pinfo.Arguments = $curlArgs
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.CreateNoWindow = $true
$curlProcess = New-Object System.Diagnostics.Process
$curlProcess.StartInfo = $pinfo
$curlProcess.Start() | Out-Null
$curlProcess.WaitForExit()

代码有时可以工作。但大部分时间将永远悬而未决。我不知道原因。当代码工作时,我可以从$curlProcess获得错误消息。如果$curlProcess。ExitCode不为0

工作,我决定使用

$curlPath = "curl.exe"
$curlArgs = "sftp://download.url.com/filename_20220618.zip --user username:psw -o D:filename_20220618.zip -k"
$curlProcess = Start-Process $curlPath -ArgumentList $curlArgs -Wait -PassThru -WindowStyle Hidden

以上代码有效。唯一的问题是当curlProcess美元。ExistCode不为0,我无法获得错误消息。curlProcess美元。StandError总是空的。

有人知道如何解决这个问题吗?

要同步执行控制台应用程序并捕获它们的输出,直接调用,做而不是使用Start-Process(或其基于的System.Diagnostics.ProcessAPI)-请参阅此答案了解背景信息,以及GitHub文档问题#6239指导何时使用Start-Process是和不合适的。

直接调用:

  • 隐式同步执行控制台应用(以阻塞方式)

  • 将控制台应用程序的stdout和stderr流连接到PowerShell流,默认情况下将它们传递给主机(display),但也允许:

    • 捕获stdout输出,通过管道输送到另一个命令或捕获在一个变量(例如,$var = curl.exe ...);注意,输出以文本的形式捕获,其中一行按原样捕获,两行或更多行作为行数组捕获。

    • 重定向stderr输出,要么重定向到文件(例如,2>errs.txt),要么将其合并到成功输出流(2>&1)中-查看此答案以获取更多信息。

  • 使进程退出代码可以通过自动$LASTEXITCODE变量。

# Prints both stdout and stderr to the display.
# $LASTEXITCODE reflects the process exit code.
curl.exe sftp://download.url.com/filename_20220618.zip --user username:psw -o D:filename_20220618.zip -k

最新更新