【问题标题】:PowerShell 1.0 Start-Process not waiting for complete when user logged off用户注销时,PowerShell 1.0 Start-Process 未等待完成
【发布时间】:2013-09-13 10:32:18
【问题描述】:

我目前正在尝试使用 Powershell 连接到远程桌面,在该桌面上运行程序,然后注销。然后,我正在检查跨文件共享运行该命令的输出。基本上这意味着 PowerShell 在继续之前应该等待该过程完成。

阅读后,我一直在尝试使用 Start-Process -Wait 选项来确保它等待进程运行。但是,此脚本必须作为计划任务运行,并且似乎只要在用户未登录时运行脚本时,-wait 就不起作用,并且脚本会继续运行而不会完成该过程。我已经尝试了几种不同的等待选项,但显然我必须在用户注销时运行计划任务来测试它,并且测试会让人筋疲力尽。这是我当前执行此操作的代码行:

$proc = $(start-process $path -Wait)

请注意,我已尝试使用 -NoNewWindow 命令,但它在我的 PowerShell 版本中不可用。

任何人对如何让它等待进程有任何其他想法?

【问题讨论】:

  • 你看过使用作业和 wait-job 命令吗?
  • 我有,但遇到了同样的问题。运行命令的行立即声明它已完成,因此 wait-job 命令的作用与 -wait 相同(当然,仅在用户未登录时再次执行)。
  • 经过排查,找到了问题的根源。通过作业或通过启动进程启动进程时,调用启动进程后进程“实际”启动需要 3 秒。所以当调用等待时,它看到进程不存在,所以它认为它已经完成(而不是还没有开始)。下面列出的 .NET 方法可以防止这种情况发生。

标签: powershell start-process


【解决方案1】:

您仍然拥有启动进程并等待他死亡的 .net 方式。查看Process 类、方法和属性。

## Start a process
$Proc = [Diagnostics.Process]::Start("calc.exe")

## Start a processus with param
$Proc = [Diagnostics.Process]::Start("notepad.exe", "Fic.txt")

## Wait for a process death
$Proc.WaitForExit()

也可以配置启动环境

$credential = Get-Credential
$startInfo = New-Object Diagnostics.ProcessStartInfo
$startInfo.UserName = $credential.Username
$startInfo.Password = $credential.Password
$startInfo.Filename = "powershell"

## Start a process with StartInfo 
$startInfo.UseShellExecute = $false
$Proc = [Diagnostics.Process]::Start($startInfo)

## Stop the process
$Proc.Kill()

【讨论】:

  • 这可以解决问题。我不确定为什么我没有在我查看的任何其他线程中找到此选项。我知道这取决于安装 .NET,但就我的目的而言,它工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2021-07-28
相关资源
最近更新 更多