Пакетный сценарий Windows открывает диалоговое окно выбора файла или перетаскивает в него файл - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь написать пакетный скрипт, который, когда вы перетаскиваете в него другой файл, будет что-то делать. Если вы ничего не уроните, просто дважды щелкните по нему, откроется диалоговое окно выбора файла.

Для первой части это просто:

@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 голосов
/ 28 августа 2018

Хитрость в этих гибридных сценариях заключается в том, чтобы скрыть пакетный код для анализатора Powershell и скрыть код Powershell для пакетного анализатора.

Для Powershell часть между <# и #> является комментарием. К счастью <# : comment не наносит вреда парсеру пакетной обработки. Таким образом, ваш пакетный код должен быть внутри этого комментария Powershell.

С другой стороны, последняя пакетная команда - goto :EOF, что означает, что все нижеприведенные (строка «конец комментария» для Powershell и самого кода Powershell) будут игнорироваться парсером Batch.

Так что просто двигайтесь вверх по своей строке <# : chooser.bat как к первой строке.

...