【问题标题】:PowerShell - Prompt for 'Would you like to continue'powershell - 提示'你想继续'
【发布时间】:2015-11-29 14:35:22
【问题描述】:

我有一个用于自动化 WSUS 进程的脚本,它的最后一个阶段继续删除所有旧的/不必要的文件/对象。

我想在清理阶段之前提示'按'输入'继续删除或任何其他键停止',让人们选择不运行它。

我目前在脚本末尾的代码在这里:

Get-WsusServer 10.1.1.25 -PortNumber 8530 | Get-WsusUpdate -Classification All -Approval Unapproved -Status FailedOrNeeded | Approve-WsusUpdate -Action Install -Target $ComputerTarget -Verbose

Write-Host "Updates have been approved!"
Write-Host "Preparing to clean WSUS Server of obsolete computers, updates, and content files."

#Part2 - WSUS Server Cleanup

##Run Cleanup Command
Get-WsusServer $WSUS_Server -PortNumber $PortNumber | Invoke-WsusServerCleanup -CleanupObsoleteComputers -CleanupObsoleteUpdates -CleanupUnneededContentFiles

就在#Part2 之前,我希望提示“按回车键继续或任何其他键中止”

我似乎找不到一个简单的方法来做到这一点?我所看到的一切似乎都涉及将整个脚本嵌套在我不想这样做的代码块中。 =/

谢谢!

【问题讨论】:

  • 你不能只使用 Read-Host 吗?
  • 我可以使用这样的东西: $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 等待按键被按下。我不知道如何过滤“输入”键(或任何其他键)以继续执行脚本,或者如果按下“n”或除“输入”以外的任何其他键,如何中止脚本。
  • 个人而言,如果涉及到删除内容,我更喜欢弹出对话框进行确认。这对你有用吗?代码可能只是一种长的单行代码,并且可以替换至少一个 Write-Host 行。
  • 是的@TheMadTechnician,那就太好了。我希望以后能有类似“y 表示是,a 表示全部是,n 表示否,c 表示取消”的提示,但是对于这种特殊情况,弹出对话框也很棒。你有任何我可以阅读的参考链接吗?(脚本仍然是超级新手=/)

标签: powershell scripting


【解决方案1】:

你可以这样提示用户:

$response = read-host "Press enter to continue or any other key (and then enter) to abort"

如果用户只是按下回车,那么$response 将为空。 Powershell 会将空字符串转换为布尔值 false:

$aborted = ! [bool]$response

或者您可以只查询特定字符:

$response = read-host "Press a to abort, any other key to continue."
$aborted = $response -eq "a"

【讨论】:

    【解决方案2】:

    所以我手头有一个 Show-MsgBox 函数来扔到脚本中。这样我就可以用一个简单的命令随意显示一个对话框,它可以选择要显示的按钮、要显示的图标、窗口标题和框中的文本。

    Function Show-MsgBox ($Text,$Title="",[Windows.Forms.MessageBoxButtons]$Button = "OK",[Windows.Forms.MessageBoxIcon]$Icon="Information"){
    [Windows.Forms.MessageBox]::Show("$Text", "$Title", [Windows.Forms.MessageBoxButtons]::$Button, $Icon) | ?{(!($_ -eq "OK"))}
    }
    

    这就是函数的全部内容,那么在您的情况下,您可以执行以下操作:

    If((Show-MsgBox -Title 'Confirm CleanUp' -Text 'Would you like to continue with the cleanup process?' -Button YesNo -Icon Warning) -eq 'No'){Exit}
    

    然后它会弹出“是”和“否”按钮,如果单击“否”则退出脚本。

    【讨论】:

    • 谢谢非常有用。太感谢了!绝对将其添加到我的小但不断增长的脚本中添加:)
    • 我会在函数中添加 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")|Out-Null 以确保它已加载并使用 break或继续而不是退出:-)
    • 没有 |out-Null :-)
    【解决方案3】:

    这并不完美,但它会让您的用户有机会逃脱脚本。它实际上可能会更好,因为这意味着您的用户不会在想要按 Enter 时意外点击反斜杠按钮并取消脚本。

    Write-Host "Press `"Enter`" to continue or `"Ctrl-C`" to cancel"
    do
    {
    $key = [Console]::ReadKey("noecho")
    }
    while($key.Key -ne "Enter")
    Write-Host "Complete"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2013-11-25
      • 2020-11-05
      • 1970-01-01
      • 2022-01-19
      • 2020-12-19
      • 1970-01-01
      相关资源
      最近更新 更多