最后一个进程关闭后重新启动 PowerShell 脚本

Restarting a PowerShell script after the last process is closed

我写了一个脚本,它打开 7 个程序大约 10 次(是的,这是一个恶作剧)。

我的问题是,有没有办法观察最后一个进程是否关闭,如果关闭,再次重新启动整个脚本?

感谢您的帮助。

while ($start -le 10){
  Start-Process mspaint.exe
  Start-Process notepad.exe
  Start-Process write.exe
  Start-Process cmd.exe
  Start-Process explorer.exe
  Start-Process control.exe
  Start-Process calc.exe
  $start =+ 1
}

编辑 1:

我的脚本现在如下所示:

$start; $process

PowerShell.exe -windowstyle hidden { script.ps1 }

while ($start -le 10){
Start-Process mspaint.exe
Start-Process notepad.exe
Start-Process write.exe
Start-Process cmd.exe
Start-Process explorer.exe
Start-Process control.exe
Start-Process calc.exe
$start =+ 1
}

$process = Get-Process mspaint.exe

if ($process = $false){
Start-Process -FilePath c:/script.ps1
}

我确实测试过这个,但它又重新开始了......我认为我使用Get-Process错误......

有没有其他方法可以观察进程是否关闭?

在看不到实际脚本的情况下,您可以使用类似

的内容
$validate  = Get-Process -Name pwsh 

if ($validate){
Start-Process -FilePath c:/script.ps1
}

如果在同一个 re-launching 脚本中无限期地处理 re-launching 是可以接受的:

# Note: This runs indefinitely.
# If run in the foreground, you can use Ctrl-C to stop.
while ($true) {
  1..10 | ForEach-Object {
    # Launch all processes and pass information 
    # about them through (-PassThru)
    'mspaint.exe',
    'notepad.exe',
    'write.exe',
    'cmd.exe',
    'explorer.exe',
    'control.exe',
    'calc.exe' | ForEach-Object {
        Start-Process -PassThru $_
      }
  } | Wait-Process # Wait for all processes to terminate.
  # Continue the loop, which launches the programs again.
}

然后您可以通过 Start-Process 在后台不可见地启动脚本;例如:

Start-Process -WindowStyle Hidden powershell.exe '-File c:\script.ps1'

警告:要停止操作,您必须找到隐藏的 PowerShell 进程并终止它。如果你添加-PassThru,你会得到一个process-information代表隐藏进程的对象。


如果您希望能够正常调用脚本本身,并让它产生一个隐藏的后台进程来监视启动的进程,然后重新调用脚本(不可见),则需要做更多的工作:

# Launch all processes 10 times and
# collect the new processes' IDs (PIDs)
$allPids = (
  1..10 | ForEach-Object {
    'mspaint.exe',
    'notepad.exe',
    'write.exe',
    'cmd.exe',
    'explorer.exe',
    'control.exe',
    'calc.exe' | ForEach-Object {
        Start-Process -PassThru $_
    }
  }
).Id

# Launch a hidden PowerShell instance
# in the background that waits for all launched processes
# to terminate and then invisibly reinvokes this script:
Start-Process -WindowStyle Hidden powershell.exe @"
-Command Wait-Process -Id $($allPids -join ',');
Start-Process -WindowStyle Hidden powershell.exe '-File \"$PSCommandPath\"'
"@

警告:要停止操作,您必须找到隐藏的 PowerShell 进程并终止它。