Bricktop Asked: 2019-10-14 05:20:15 +0800 CST2019-10-14 05:20:15 +0800 CST 2019-10-14 05:20:15 +0800 CST 打开一个弹出窗口进行多项选择? 772 我正在编写一个batch运行视频播放列表的脚本,一个一个地打开它们,并要求在视频之间采取行动。有没有办法打开一个弹出窗口进行多项选择?如果不采取任何操作,此弹出窗口应在几秒钟内关闭,以便播放列表可以继续。没有本地 Microsoft 命令行工具可以做到这一点,正在寻找解决方法。 batch popups 2 个回答 Voted Albin 2019-10-14T11:35:28+08:002019-10-14T11:35:28+08:00 虽然可能没有“直接方式”,但有几种变通方法,例如执行time out主脚本,而第二个脚本执行用户查询。例如,第二个脚本可以将其结果写入文件(或者不写入,如果它被忽略)。超时后,第一个脚本继续评估结果(如果第二个脚本被忽略,则取消第二个脚本)。 这一切都取决于您要用于批处理文件的命令终端类型,例如 powershell、cmd 或其他。这里有一些例子: 这是在cmd中添加超时的方法 这是在powershell中添加超时的方法 Best Answer Io-oI 2021-09-10T23:01:23+08:002021-09-10T23:01:23+08:00 <# :^ Starting bat script and PowerShell comment @echo off && cd /d "%~dp0" & color 0a echo & setlocal EnableDelayedExpansion title Batch files and Powershell hybrids %__AppDir__%mode.com con:cols=080lines=009 echo. & echo. hybrid .cmd/.bat ^& ps1 echo\===================================== for /f usebackq^tokens^=*delims^= %%i in (` set "_=0" ^& type "%~f0"^|powershell.exe -nOp -c - `)do 2>&1 (if "%%~i" == "[ Error 1 ]" (goto %:^| )else if "%%~i" == "[ Error 2 ]" (goto %:^O )else if "%%~i" == "[ Error 3 ]" (goto %:^V )else if "%%~i" == "[ Error 4 ]" (goto %:^? )else set/a "_+=1" && call %:^) !_! "%%~i") if !_! equ 0 goto %:^? endlocal & %__AppDir__%timeout.exe 01 | ( echo/- The job is done!) & goto :eof %:^| endlocal & %__AppDir__%timeout.exe 01 | ( echo/- Canceled by user!) & goto :eof %:^? endlocal & %__AppDir__%timeout.exe 01 | ( echo/- Timeout reached!) & goto :eof %:^) rem. :: & %__AppDir__%timeout.exe 01 | ( echo\Clicked Itens #%~1: "%~2") & exit /b %:^O endlocal & %__AppDir__%timeout.exe 01 | ( echo\Nothing selected by user) & goto :eof %:^V endlocal & %__AppDir__%timeout.exe 01 | ( echo\#Error: no \subfolders) & goto :eof :: End Bat Session and Starting PowerShell Script >" :: #> function SourceDirectory ([string]$Message, [string]$work_dir, [switch]$NoNewFolderButton ) { $browseForFolderOptions = 0 $browseForFolderOptions += 512 $app = New-Object -ComObject Shell.Application $folder = $app.BrowseForFolder(0, $Message, $browseForFolderOptions, $work_dir) if ($folder) { $selectedDirectory = $folder.Self.Path } else { $selectedDirectory = '' } [System.Runtime.Interopservices.Marshal]::ReleaseComObject($app) > $null return $selectedDirectory } $work_dir = Push-Location $PSScriptRoot Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $form = New-Object System.Windows.Forms.Form $form.Text = 'Select Folders use Control' $form.Size = New-Object System.Drawing.Size(330,200) $form.StartPosition = 'CenterScreen' $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Point(75,120) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = 'OK' $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $form.AcceptButton = $OKButton $form.Controls.Add($OKButton) $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Point(150,120) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = 'Cancel' $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $form.CancelButton = $CancelButton $form.Controls.Add($CancelButton) $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10,20) $label.Size = New-Object System.Drawing.Size(560,20) $label.Text = 'Please make a selection from the list below:' $form.Controls.Add($label) $Global:timer = New-Object System.Windows.Forms.Timer $Global:EndDate = ((Get-Date).AddSeconds(+10)).ToString("mmss") $Global:timer.Add_Tick({ if ($EndDate -lt (Get-Date).ToString("mmss")) { $timer.Stop(); $form.Close(); Write-Host '[ Error 4 ]'}}) $listBox = New-Object System.Windows.Forms.Listbox $listBox.Location = New-Object System.Drawing.Point(10,40) $listBox.Size = New-Object System.Drawing.Size(260,20) $listBox.SelectionMode = 'MultiExtended' [void] $listBox.Items.Remove('Item *') if ((ls -ad $work_dir).count -eq 0){'[ Error 3 ]'; break } else { ls -ad $work_dir | ? {[void] $listBox.Items.Add($_) } } $listBox.Height = 70 $form.Controls.Add($listBox) $form.Topmost = $true; $timer.Start(); $result = $form.ShowDialog() if ($result -eq [System.Windows.Forms.DialogResult]::Cancel) {'[ Error 1 ]' ; break} if ($result -eq [System.Windows.Forms.DialogResult]::OK) { if ($listBox.SelectedItems.Count -gt 0) { (resolve-path($listBox.SelectedItems) | select -ExpandProperty Path )| % { $_ } } else {'[ Error 2 ]'; break} } Pop-Location ; exit 您可以将混合 bat 与powershell一起使用,并在互联网上可用的示例进行一些搜索。 您可以快速调整它,使其最适合您的目标,并利用由此产生的学习并考虑迁移到powershell。 下面是一个使用我几个月前制作的脚本的示例,该脚本通过多选/单击获取文件夹列表,我通过将输出添加到用户的以下操作来进行调整: 选定项目 未选择的项目 取消点击/关闭 超时 10 秒 // 如果没有操作 Start-CountDownTimer.ps1 多选列表框 powershell脚本中的取消按钮 Windows PowerShell 命令的 AZ 索引 如何在 ps1 中添加计时器以在一定时间后退出表单
虽然可能没有“直接方式”,但有几种变通方法,例如执行
time out
主脚本,而第二个脚本执行用户查询。例如,第二个脚本可以将其结果写入文件(或者不写入,如果它被忽略)。超时后,第一个脚本继续评估结果(如果第二个脚本被忽略,则取消第二个脚本)。这一切都取决于您要用于批处理文件的命令终端类型,例如 powershell、cmd 或其他。这里有一些例子:
这是在cmd中添加超时的方法
这是在powershell中添加超时的方法
您可以将混合 bat 与powershell一起使用,并在互联网上可用的示例进行一些搜索。
您可以快速调整它,使其最适合您的目标,并利用由此产生的学习并考虑迁移到powershell。
下面是一个使用我几个月前制作的脚本的示例,该脚本通过多选/单击获取文件夹列表,我通过将输出添加到用户的以下操作来进行调整: