标题: [问题求助] PowerShell怎样实现简单的倒计时? [打印本页]
作者: 小白龙 时间: 2024-9-3 11:30 标题: PowerShell怎样实现简单的倒计时?
我想实现一个简单的倒计时消息框, 等30秒, 如果未做选择, 自动确认, 下面的gpt写的居然错了, 有简单点的方法吗?- Add-Type -AssemblyName 'System.Windows.Forms'
-
- # 显示消息框
- $dialogResult = [System.Windows.Forms.MessageBox]::Show(
- "是否重启电脑?",
- "提示",
- [System.Windows.Forms.MessageBoxButtons]::YesNo,
- [System.Windows.Forms.MessageBoxIcon]::Warning
- )
-
- # 等待指定的倒计时时间(秒)
- $timeout = 3
- Start-Sleep -Seconds $timeout
-
- # 如果用户选择了“是”,立即重启
- if ($dialogResult -eq [System.Windows.Forms.DialogResult]::Yes) {
- Write-Host "用户选择重启,正在重启电脑..."
- shutdown /r /t 0
- } else {
- Write-Host "用户选择不重启,退出程序。"
- exit
- }
复制代码
作者: ppll2030 时间: 2024-9-3 15:00
回复 1# 小白龙
简单的就不要弹窗了。bat就可以了。
第二行的 30 表示 30秒,其他时长可自行修改- @echo off
- choice /c 12 /d 1 /t 30 /m "确认请按 1,取消请按 2。倒计时30秒后自动选择 1"
- goto %errorlevel%
- :1
- echo 执行重启
- goto end
- :2
- echo 取消重启
- goto end
- :end
- pause>nul
复制代码
非要弹窗。就需要其他的辅助
第三行的 30 表示 30秒,其他时长可自行修改- @Echo Off
- (Echo Set WshShell = WScript.CreateObject("WScript.Shell"^)
- Echo wscript.Echo WshShell.Popup("确认此操作吗?", 30, "自动确认", vbYesNo^))>tmp.vbs
- For /f %%i in ('cscript /nologo tmp.vbs') do (
- if %%i == 6 echo 执行确认操作。
- if %%i == 7 echo 取消操作和关闭。
- if %%i == -1 echo 自动执行确认操作。
- )
- Del /q tmp.vbs >nul
- 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# 小白龙 - $n=0; $t=3; echo('是否重启电脑? 1=是 0=否 等待3秒后自动退出放弃')
- while (!$host.ui.rawui.keyavailable -and ($n++ -lt $t)) { [threading.thread]::sleep(1000) }
- if ($n -lt 4) {
- $k=$host.ui.rawui.readkey('NoEcho,IncludeKeyUp').virtualkeycode
- if ($k -eq 49) { echo('选择重启,正在重启电脑...'); shutdown /r /t 0 }
- }
- #echo('选择不重启,退出程序')
- exit
复制代码
作者: Five66 时间: 2024-9-4 00:14
MessageBox::Show是模态的,会阻塞当前线程直到点击选择
可以弄个线程来专门控制或调用
例如试试下面的- Add-Type -AssemblyName 'System.Windows.Forms'
-
- $def_msgbox = [powershell]::Create().addscript({
- [System.Windows.Forms.MessageBox]::Show(
- "是否重启电脑?",
- "提示",
- [System.Windows.Forms.MessageBoxButtons]::YesNo,
- [System.Windows.Forms.MessageBoxIcon]::Warning
- )
- })
-
- # 显示消息框
- $async_dialogResult=$def_msgbox.BeginInvoke()
-
- # 等待指定的倒计时时间(秒)
- $timeout = 30
- #Start-Sleep -Seconds $timeout
-
- $___time=get-date
- while($true){
-
- #判断是否有选择
- if($async_dialogResult.IsCompleted){
- $dialogResult=$def_msgbox.EndInvoke($async_dialogResult)
- break
- }
-
- #判断是否超时
- if(((get-date) - $___time).Seconds -ge $timeout){
- $dialogResult=[System.Windows.Forms.DialogResult]::No
- break
- }
-
- Start-Sleep -Milliseconds 200
- }
-
- # 如果用户选择了“是”,立即重启
- if ($dialogResult -eq [System.Windows.Forms.DialogResult]::Yes) {
- Write-Host "用户选择重启,正在重启电脑..."
- shutdown /r /t 0
- } else {
- Write-Host "用户选择不重启,退出程序。"
- exit
- }
复制代码
作者: ppll2030 时间: 2024-9-4 11:52
看了楼上的我就觉得昨晚死的脑细胞不怨
今天还是搞了一个PS+VBS的,也算满足楼主的要求吧。- # 设置VBS文件的内容
- $vbsContent = @"
- Set WshShell = WScript.CreateObject("WScript.Shell")
- wscript.Echo WshShell.Popup("确认此操作吗?", 5, "自动确认", vbYesNo)
- "@
-
- # 将VBS内容写入文件
- Set-Content -Path "tmp.vbs" -Value $vbsContent
-
- # 执行VBS文件
- $exitCode = cscript //NoLogo "tmp.vbs"
-
- # 根据 VBS 的反馈执行不同的命令
- if ($exitCode -eq 7 ) {
- # 弹窗选择取消,停止或退出
- Write-Host "选择取消,停止或退出"
- } else {
- # 弹窗选择确定,或是倒计时5秒后自动确定
- Write-Host "选择确定,继续执行下一个命令"
- }
-
- # 清理VBS文件
- Remove-Item -Path "tmp.vbs"
-
- pause
复制代码
作者: aloha20200628 时间: 2024-9-4 13:45
本帖最后由 aloha20200628 于 2024-9-4 13:49 编辑
回复 1# 小白龙
其实 powershell 可以直接调用 wscript.shell 的弹窗限时确认功能,确认选项共有 1-7 种
另注》5楼代码可实现 ps 命令行的限时输入,但运行代码前要确保是英文输入状态...
- $ws = new-object -comobject wscript.shell
- $v = $ws.popup("是否重启电脑?", 3, "等待3秒后自动退出放弃", 1)
- if ($v -eq 1) { echo('选择重启,正在重启电脑...'); shutdown /r /t 0 }
- #echo('选择不重启,退出程序')
- exit
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |