• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

Диалоговое окно открытия файла (FileOpenDialog и FolderOpenDialog) в CMD

Foxik

Активный пользователь
Сообщения
40
Симпатии
19
#1
FileOpenDialog Может кому пригодиться....

в первой строке rem убрать
CMD/BATCH:
rem<!-- : 
@echo off & cls
for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (set "file=%%~fp")

echo selected  file is : "%file%"
pause

exit /b
-->
<input type=file id=FILE>
<script>FILE.click();
new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value)
close()
resizeTo(0,0)
</script>

FolderOpenDialog... через ps
CMD/BATCH:
@echo off
set "psCommand="(new-object -COM 'Shell.Application')^
.BrowseForFolder(0,'Please choose a folder.',0,0).self.path""
for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "folder=%%I"


echo selected  folder is :  %folder%
pause
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#2
Работает в неверной кодировке (если выбрать файл с русскими символами).

Если Вы не против, я его немного проапгрейдил :)
FileOpenDialogue

CMD/BATCH:
@echo off
SetLocal EnableExtensions

for /f "tokens=2 delims=:" %%i in ('chcp') do set sPrevCP=%%i& chcp 1251 >nul
for /f "usebackq delims=" %%i in (`mshta.exe "about:<input type=file id=F><script>F.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(F.value);close();</script>" ^|more`) do (
  set file=%%i
)
chcp %sPrevCP% >nul
if defined file (
    echo Выбран файл: %file%
) else (
    echo Файл не был выбран.
)
pause >NUL
goto :eof
FileOpen.png


FolderOpenDialog через hta (в отличие от варианта PowerShell, будет работать в т.ч. и на Win XP):

CMD/BATCH:
@echo off
Setlocal EnableExtensions

for /f "tokens=2 delims=:" %%i in ('chcp') do set sPrevCP=%%i& chcp 1251 >nul
for /f "usebackq delims=" %%i in (
    `@"%systemroot%\system32\mshta.exe" "javascript:var objShellApp = new ActiveXObject('Shell.Application');var Folder = objShellApp.BrowseForFolder(0, 'SELECT FOLDER',1, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}');try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path)};catch (e){};close();" ^
    1^|more`
) do set sFolderName=%%i

chcp %sPrevCP% >nul

if defined sFolderName (
    echo Выбрана папка: %sFolderName%
) else (
    echo Папка не была выбрана.
)
pause
(не помню, кто автор)

folderOpen.png
 

Foxik

Активный пользователь
Сообщения
40
Симпатии
19
#3
С кодировкой согласен, я бы сделал не усложняя :

CMD/BATCH:
chcp 1251 >NUL
for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (set "file=%%~fp")
chcp 866 >NUL
А FolderOpenDialog, тоже не мое. Просто понравился вариант через PS, без создания временных EXE
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#4
Тоже 2 строки только более универсальней :)
Иногда бывает нужно, чтобы батник большую часть времени работал под cp1251.
 

Foxik

Активный пользователь
Сообщения
40
Симпатии
19
#5
Тоже 2 строки только более универсальней :)
Иногда бывает нужно, чтобы батник большую часть времени работал под cp1251.
Согласен, главное наверно , возвращает кодировку по умолчанию
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,434
Симпатии
5,292
#6
FolderOpenDialog
- по виду точно такой же как диалог открытия файлов, но предназначен для выбора папки.

folderOpendlg.png

На основе программы (.exe) на VB6. Автор: The Trick.
Модифицирован мной для поддержки юникодных путей + консольная обертка.

dlgOpenFolder.exe положить рядом с батником.
CMD/BATCH:
@echo off
SetLocal EnableExtensions

For /F "delims=" %%a in ('dlgOpenFolder.exe') do set sFolderName=%%a
if defined sFolderName (
    echo Выбрана папка: %sFolderName%
) else (
    echo Папка не была выбрана.
)
pause>NUL
Можно также выбирать сразу несколько папок, тогда код батника нужно поменять, например на такой:
CMD/BATCH:
For /F "delims=" %%a in ('dlgOpenFolder.exe') do echo Выбрана папка: %%a
Также можно задавать 1-м аргументом программы папку, на которой следует открыть диалоговое окно.
CMD/BATCH:
For /F "delims=" %%a in ('dlgOpenFolder.exe "c:\"') do echo Выбрана папка: %%a
Программа, батник и исходники в архиве.
 

Вложения

Последнее редактирование: