最后一个进程关闭后重新启动 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 进程并终止它。
我写了一个脚本,它打开 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 进程并终止它。