我尝试编写一个批处理脚本,当您将另一个文件拖放到该脚本时,它将执行某些操作。如果您不放任何东西,只需双击它,它将打开一个文件选择对话框窗口。
第一部分很简单:
@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 }
答案 0 :(得分:3)
使用这些Hybrid脚本的技巧是,隐藏Powershell解析器的批处理代码,并隐藏批处理解析器的Powershell代码。
对于Powershell,<#
和#>
之间的部分是注释。值得庆幸的是,<# : comment
对批处理解析器没有害处。因此,您的批处理代码应该在Powershell注释中。
另一方面,最后一个批处理命令是goto :EOF
,这意味着批处理解析器将忽略下面的所有内容(Powershell和Powershell代码本身的“注释结束”行)。
因此,只需将<# : chooser.bat
行作为第一行。