Windows批处理脚本打开文件选择器对话框或将文件拖放到该对话框

时间:2018-08-28 01:51:50

标签: windows batch-file cmd drag-and-drop filechooser

我尝试编写一个批处理脚本,当您将另一个文件拖放到该脚本时,它将执行某些操作。如果您不放任何东西,只需双击它,它将打开一个文件选择对话框窗口。

第一部分很简单:

@echo off
bin\dosomething "%~1"

第二部分,我用谷歌搜索了这个线程:https://stackoverflow.com/a/15885133/1683264

它也可以工作。

但是,我不能将两者合二为一。我尝试过

if "%~1" == [] goto select

然后在第二部分之前添加:select,只是不起作用。下面的代码:

@ECHO OFF
if "%~1" == [] goto select
bin\dosomething "%~1"
goto :EOF

:select

<# : chooser.bat
:: launches a File... Open sort of file chooser and outputs choice(s) to the console
:: https://stackoverflow.com/a/15885133/1683264

@echo off
setlocal

for /f "delims=" %%I in ('powershell -noprofile "iex (${%~f0} | out-string)"') do (
    echo You chose %%~I
    bin\dosomething "%%~I"
)
goto :EOF

: end Batch portion / begin PowerShell hybrid chimera #>

Add-Type -AssemblyName System.Windows.Forms
$f = new-object Windows.Forms.OpenFileDialog
$f.InitialDirectory = pwd
$f.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*"
$f.ShowHelp = $true
$f.Multiselect = $true
[void]$f.ShowDialog()
if ($f.Multiselect) { $f.FileNames } else { $f.FileName }

我尝试了If "%~1"=="",它是有目的的跳了起来,但是对话框窗口仍然没有出现,CMD直接将错误行输出为:

You chose + iex (${D:\Program Files (x86)\BBB\choose list file.bat} | out-strin ...

已解决

已解决。只有“%〜1”正确。

我在此处粘贴代码:

<# : chooser.bat

:: drop file to execute, or open a file chooser dialog window to execute.
:: code mostly comes from https://stackoverflow.com/a/15885133/1683264

@ECHO OFF

if "%~1" == "" goto SELECT
bin\dosomething "%~1"
goto :EOF

:SELECT

setlocal
for /f "delims=" %%I in ('powershell -noprofile "iex (${%~f0} | out-string)"') do (
    echo You chose %%~I
    bin\dosomething "%%~I"
)
goto :EOF

: end Batch portion / begin PowerShell hybrid chimera #>

Add-Type -AssemblyName System.Windows.Forms
$f = new-object Windows.Forms.OpenFileDialog
$f.InitialDirectory = pwd
$f.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*"
$f.ShowHelp = $true
$f.Multiselect = $true
[void]$f.ShowDialog()
if ($f.Multiselect) { $f.FileNames } else { $f.FileName }

1 个答案:

答案 0 :(得分:3)

使用这些Hybrid脚本的技巧是,隐藏Powershell解析器的批处理代码,并隐藏批处理解析器的Powershell代码。

对于Powershell,<##>之间的部分是注释。值得庆幸的是,<# : comment对批处理解析器没有害处。因此,您的批处理代码应该在Powershell注释中。

另一方面,最后一个批处理命令是goto :EOF,这意味着批处理解析器将忽略下面的所有内容(Powershell和Powershell代码本身的“注释结束”行)。

因此,只需将<# : chooser.bat行作为第一行。