Если вы не владеете несколькими языками сценариев, их всегда сложно объединить.
Вам следует разработать свое решение в PowerShell и, если действительно необходимо, обернуть его в пакетном режиме, как только оно заработает должным образом.
OpenFileDialog
нужны дополнительные настройки перед вызовом метода .ShowDialog()
:
$OpenFileDialog.Multiselect = $true
$OpenFileDialog.Filter = 'TXT (*.txt)| *.txt'
$OpenFileDialog.InitialDirectory = [Environment]::GetFolderPath('Desktop')
Также результат Multiselect возвращается в свойстве FileNames
, обратите внимание на множественное число.
Вся часть PowerShell с коротким именем переменной $OFD
[System.Reflection.Assembly]::LoadWithPartialName('System.windows.forms')|Out-Null
$OFD = New-Object System.Windows.Forms.OpenFileDialog
$OFD.Multiselect = $True
$OFD.Filter = 'TXT (*.txt)| *.txt'
$OFD.InitialDirectory = [Environment]::GetFolderPath('Desktop')
$OFD.ShowDialog()|out-null
$OFD.FileNames
Как подсказал Аасини, используйте переменную массива для получения имен файлов в пакете
:: Q:\Test\2018\09\09\SO_52240766.cmd
@Echo off & Setlocal EnableDelayedExpansion
rem preparation command
set pwshcmd=powershell -NoP -C "[System.Reflection.Assembly]::LoadWithPartialName('System.windows.forms')|Out-Null;$OFD = New-Object System.Windows.Forms.OpenFileDialog;$OFD.Multiselect = $True;$OFD.Filter = 'TXT (*.txt)| *.txt';$OFD.InitialDirectory = [Environment]::GetFolderPath('Desktop');$OFD.ShowDialog()|out-null;$OFD.FileNames"
rem exec commands powershell and get result in FileName variable
Set i=0
for /f "delims=" %%I in ('%pwshcmd%') do (
Set /A i+=1
set "FileName[!i!]=%%I"
)
If %i% gtr 0 (
Echo %i% files selected
Set FileName
) else (
Echo no files selected
)
Пример вывода
15:39:24 Q:\Test\2018\09\09________________________________________
> SO_52240766.cmd
2 files selected
FileName[1]=C:\Users\LotPings\Desktop\Dokument1.txt
FileName[2]=C:\Users\LotPings\Desktop\espressif-MAC1.txt