【问题标题】:A windows batch script open a file chooser dialog or drag-and-drop file to itWindows 批处理脚本打开文件选择器对话框或将文件拖放到其中
【发布时间】:2018-08-28 01:51:49
【问题描述】:

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

对于第一部分,很简单:

@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 }

【问题讨论】:

  • IF 语法不正确。这是一个字符串比较。如果您在比较的一侧有引号,则必须在比较的另一侧有引号。删除括号并使用引号检查命令行参数是否为空。
  • 我尝试了所有可能的方法,"%~1" == "", [%~1] == [], "%~1" == [], [%~1] == “”。前两个是对的。但它仍然不能作为目的。脚本直接输出一些行,而不是跳出对话窗口。
  • 两个相等的符号。
  • 你也不了解如何使用混合。您所有的批处理文件代码都需要在 powershell 脚本的 cmets 部分中。
  • 哦,这就是为什么我不能用谷歌搜索符号 "

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


【解决方案1】:

这些混合脚本的诀窍在于,隐藏 Powershell 解析器的批处理代码并隐藏批处理解析器的 Powershell 代码。

对于 Powershell,&lt;##&gt; 之间的部分是注释。谢天谢地 &lt;# : comment 对批处理解析器没有害处。所以你的批处理代码应该在那个 Powershell 注释中。

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

因此,只需将您的行上移@98​​7654325@ 作为第一行。

【讨论】:

  • 我可以再问一个问题。 'powershell -noprofile "iex (${%~f0} | out-string)"' 是否意味着调用 powershell 并将批处理文件本身传递给 powershell 执行?然后PS忽略了“注释”继续运行其余代码?
  • 没错。 %~f0 是批处理的方法来获取自己的完整限定文件名(完整的 `drive:\path\name.extension')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2019-03-04
  • 2013-01-19
相关资源
最近更新 更多