powershell - Powershell脚本停止进程并继续
问题描述
我有一个脚本,我在其中在计算机列表上运行 shutdown.exe 命令。该脚本工作正常,直到由于某种原因挂起。
有没有办法让我可以“ctrl + c”关闭命令,然后继续下一台电脑。
这是我使用的。
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
解决方案
该Restart-Computer
cmdlet将使您能够并行定位多台计算机,而一台计算机上的问题不会影响其他计算机的执行。
正如您所说,Restart-Computer
这不是您的选择,因为您希望在给定计算机上启动重新启动之前有一个延迟(这是shutdown -r -t <secs>
给您的;请注意,虽然Restart-Computer
确实有一个-Delay
参数,但它的目的是不同的)。
如果:
- 您的目标计算机已设置为PowerShell 远程处理
- 并且您可以运行提升的脚本(具有管理权限)
您可以使用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 输出,并且 stderr 输出不作用于ForEach-Object
)。
推荐阅读
- c++ - 是否有注册表值来获取 Edge 浏览器的用户数据位置?
- javascript - 如何使用 google recaptcha v2 验证 html 和 node.js 应用程序中的表单提交
- python - 如何记录子类的实例化参数
- sql - 从 sqlplus 输出 json。格式化它,使其出现在一行上
- shell - Peoplesoft:Unix 命令从 EXEC() 返回错误代码 1,但从 putty 工作
- python - 反转数字的按位字节顺序
- sql - WHERE 子句中的 JOIN 或嵌套 SELECT 以按值列表过滤
- laravel - 需要帮助 resolveRouteBinding 在 Laravel 8 中工作
- jquery - 我只想要一个 timeajax 请求
- f# - 乱序收集和验证参数