Board logo

标题: [问题求助] PowerShell怎样实现简单的倒计时? [打印本页]

作者: 小白龙    时间: 2024-9-3 11:30     标题: PowerShell怎样实现简单的倒计时?

我想实现一个简单的倒计时消息框, 等30秒, 如果未做选择, 自动确认, 下面的gpt写的居然错了, 有简单点的方法吗?
  1. Add-Type -AssemblyName 'System.Windows.Forms'
  2. # 显示消息框
  3. $dialogResult = [System.Windows.Forms.MessageBox]::Show(
  4.     "是否重启电脑?",
  5.     "提示",
  6.     [System.Windows.Forms.MessageBoxButtons]::YesNo,
  7.     [System.Windows.Forms.MessageBoxIcon]::Warning
  8. )
  9. # 等待指定的倒计时时间(秒)
  10. $timeout = 3
  11. Start-Sleep -Seconds $timeout
  12. # 如果用户选择了“是”,立即重启
  13. if ($dialogResult -eq [System.Windows.Forms.DialogResult]::Yes) {
  14.     Write-Host "用户选择重启,正在重启电脑..."
  15.     shutdown /r /t 0
  16. } else {
  17.     Write-Host "用户选择不重启,退出程序。"
  18.     exit
  19. }
复制代码

作者: ppll2030    时间: 2024-9-3 15:00

回复 1# 小白龙

简单的就不要弹窗了。bat就可以了。
第二行的 30 表示 30秒,其他时长可自行修改
  1. @echo off
  2. choice /c 12 /d 1 /t 30 /m "确认请按 1,取消请按 2。倒计时30秒后自动选择 1"
  3. goto %errorlevel%
  4. :1
  5. echo 执行重启
  6. goto end
  7. :2
  8. echo 取消重启
  9. goto end
  10. :end
  11. pause>nul
复制代码
非要弹窗。就需要其他的辅助
第三行的 30 表示 30秒,其他时长可自行修改
  1. @Echo Off
  2. (Echo Set WshShell = WScript.CreateObject("WScript.Shell"^)
  3. Echo wscript.Echo WshShell.Popup("确认此操作吗?", 30, "自动确认", vbYesNo^))>tmp.vbs
  4. For /f %%i in ('cscript /nologo tmp.vbs') do (
  5. if %%i == 6 echo 执行确认操作。
  6. if %%i == 7 echo 取消操作和关闭。
  7. if %%i == -1 echo 自动执行确认操作。
  8. )
  9. Del /q tmp.vbs >nul
  10. pause
复制代码

作者: 小白龙    时间: 2024-9-3 16:22

回复 2# ppll2030


    多谢, 我想用powershell实现, 您的方法二, 貌似是个不错的方法
作者: ppll2030    时间: 2024-9-3 20:19

回复 3# 小白龙


    PS不熟悉,不过貌似PS也可以调用vbs来生成窗口滴
作者: aloha20200628    时间: 2024-9-3 22:18

本帖最后由 aloha20200628 于 2024-9-4 15:26 编辑

回复 1# 小白龙
  1. $n=0; $t=3; echo('是否重启电脑? 1=是 0=否 等待3秒后自动退出放弃')
  2. while (!$host.ui.rawui.keyavailable -and ($n++ -lt $t)) { [threading.thread]::sleep(1000) }
  3. if ($n -lt 4) {
  4. $k=$host.ui.rawui.readkey('NoEcho,IncludeKeyUp').virtualkeycode
  5. if ($k -eq 49) { echo('选择重启,正在重启电脑...'); shutdown /r /t 0 }
  6. }
  7. #echo('选择不重启,退出程序')
  8. exit
复制代码

作者: Five66    时间: 2024-9-4 00:14

MessageBox::Show是模态的,会阻塞当前线程直到点击选择
可以弄个线程来专门控制或调用

例如试试下面的
  1. Add-Type -AssemblyName 'System.Windows.Forms'
  2. $def_msgbox = [powershell]::Create().addscript({
  3. [System.Windows.Forms.MessageBox]::Show(
  4.     "是否重启电脑?",
  5.     "提示",
  6.     [System.Windows.Forms.MessageBoxButtons]::YesNo,
  7.     [System.Windows.Forms.MessageBoxIcon]::Warning
  8. )
  9. })
  10. # 显示消息框
  11. $async_dialogResult=$def_msgbox.BeginInvoke()
  12. # 等待指定的倒计时时间(秒)
  13. $timeout = 30
  14. #Start-Sleep -Seconds $timeout
  15. $___time=get-date
  16. while($true){
  17. #判断是否有选择
  18. if($async_dialogResult.IsCompleted){
  19. $dialogResult=$def_msgbox.EndInvoke($async_dialogResult)
  20. break
  21. }
  22. #判断是否超时
  23. if(((get-date) - $___time).Seconds -ge $timeout){
  24. $dialogResult=[System.Windows.Forms.DialogResult]::No
  25. break
  26. }
  27. Start-Sleep -Milliseconds 200
  28. }
  29. # 如果用户选择了“是”,立即重启
  30. if ($dialogResult -eq [System.Windows.Forms.DialogResult]::Yes) {
  31.     Write-Host "用户选择重启,正在重启电脑..."
  32.     shutdown /r /t 0
  33. } else {
  34.     Write-Host "用户选择不重启,退出程序。"
  35.     exit
  36. }
复制代码

作者: ppll2030    时间: 2024-9-4 11:52

看了楼上的我就觉得昨晚死的脑细胞不怨
今天还是搞了一个PS+VBS的,也算满足楼主的要求吧。
  1. # 设置VBS文件的内容
  2. $vbsContent = @"
  3. Set WshShell = WScript.CreateObject("WScript.Shell")
  4. wscript.Echo WshShell.Popup("确认此操作吗?", 5, "自动确认", vbYesNo)
  5. "@
  6. # 将VBS内容写入文件
  7. Set-Content -Path "tmp.vbs" -Value $vbsContent
  8. # 执行VBS文件
  9. $exitCode = cscript //NoLogo "tmp.vbs"
  10. # 根据 VBS 的反馈执行不同的命令
  11. if ($exitCode -eq 7 ) {
  12.     # 弹窗选择取消,停止或退出
  13.     Write-Host "选择取消,停止或退出"
  14. } else {
  15.     # 弹窗选择确定,或是倒计时5秒后自动确定
  16.     Write-Host "选择确定,继续执行下一个命令"
  17. }
  18. # 清理VBS文件
  19. Remove-Item -Path "tmp.vbs"
  20. pause
复制代码

作者: aloha20200628    时间: 2024-9-4 13:45

本帖最后由 aloha20200628 于 2024-9-4 13:49 编辑

回复 1# 小白龙

其实 powershell 可以直接调用 wscript.shell 的弹窗限时确认功能,确认选项共有 1-7 种
另注》5楼代码可实现 ps 命令行的限时输入,但运行代码前要确保是英文输入状态...
  1. $ws = new-object -comobject wscript.shell
  2. $v = $ws.popup("是否重启电脑?", 3, "等待3秒后自动退出放弃", 1)
  3. if ($v -eq 1) { echo('选择重启,正在重启电脑...'); shutdown /r /t 0 }
  4. #echo('选择不重启,退出程序')
  5. exit
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2