Powershell脚本停止进程并继续

问题描述 投票:1回答:1

我有一个脚本,我在计算机列表上运行shutdown.exe命令。该脚本工作正常,直到它因某些原因挂起。

有没有办法,我可以“ctrl + c”关机命令,然后进入下一台PC。

这是我正在使用的。

buttonRestartWorkstations_Click={
#TODO: Place custom script here

$online = $checkedlistbox1.CheckedItems | where { Test-Connection -
ComputerName $_ -Count 1 -Quiet }

$computercount = $online.Items.Count

$progressbar1.Maximum = $online.Count
$progressbar1.Step = 1
$progressbar1.Value = 0

foreach ($computer in $online)

{
    $progressbar1.PerformStep()
    shutdown -r -t $textbox3.Text -m $computer
    Start-Sleep -s 1

}
$label2.Visible = $true
$label2.Text = "Selected Servers will reboot on the " + $textbox1.text
powershell
1个回答
0
投票

Restart-Computer cmdlet将使您能够并行地定位多台计算机,在一台计算机上没有问题影响其他计算机的执行。

正如你所说,Restart-Computer不适合你,因为你想在给定计算机上启动重启之前有一个延迟(这是shutdown -r -t <secs>给你的;请注意,虽然Restart-Computer确实有-Delay参数,但它的目的是不同的) 。

如果:

  • 您的目标计算机已设置为PowerShell remoting
  • 并且您可以升级脚本(具有管理权限)

您可以使用Invoke-Command并行定位计算机,然后在本地运行shutdown.exe(PSv3 +语法):

$delay = $textbox3.Text
Invoke-Command -ComputerName $online { 
  shutdown -r -t $using:delay
  "$(('FAILED to initiate', 'Successfully initiated')[$LASTEXITCODE -eq 0]) reboot on $env:COMPUTERNAME."
} | ForEach-Object { $progressbar1.PerformStep() }

就像您的原始代码一样,每次目标计算机上的执行都将在启动重启后返回,但执行将并行执行,并且从目标计算机收到的响应不保证按输入顺序。

如果您想验证并等待成功重启,则需要做更多工作。

任何错误都以红色打印到控制台,以后可以在$Error集合中进行检查。

请注意"$(('FAILED to initiate', 'Successfully initiated')[$LASTEXITCODE -eq 0]) reboot on $env:COMPUTERNAME."的主要目的是无条件地在每台计算机上生成一些(非错误)输出,以便为每个计算机调用ForEach-Object脚本块(shutdown默认不生成stdout输出,并且ForEach-Object不执行stderr输出) 。

© www.soinside.com 2019 - 2024. All rights reserved.