FileOpenDialog и FolderOpenDialog в CMD

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Foxik, 19 фев 2016.

  1. Foxik
    Оффлайн

    Foxik Новый пользователь

    Сообщения:
    24
    Симпатии:
    10
    FileOpenDialog Может кому пригодиться....

    в первой строке rem убрать
    Код (DOS):
    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
    Код (DOS):

    @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 и Kиpилл нравится это.
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.308
    Работает в неверной кодировке (если выбрать файл с русскими символами).

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

    Код (DOS):
    @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):

    Код (DOS):
    @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
     
    Kиpилл нравится это.
  3. Foxik
    Оффлайн

    Foxik Новый пользователь

    Сообщения:
    24
    Симпатии:
    10
    С кодировкой согласен, я бы сделал не усложняя :

    Код (DOS):
    chcp 1251 >NUL
    for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (set "file=%%~fp")
    chcp 866 >NUL
    --- Объединённое сообщение, 20 фев 2016 ---
    А FolderOpenDialog, тоже не мое. Просто понравился вариант через PS, без создания временных EXE
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.308
    Тоже 2 строки только более универсальней :)
    Иногда бывает нужно, чтобы батник большую часть времени работал под cp1251.
     
  5. Foxik
    Оффлайн

    Foxik Новый пользователь

    Сообщения:
    24
    Симпатии:
    10
    Согласен, главное наверно , возвращает кодировку по умолчанию
     
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.308
    FolderOpenDialog
    - по виду точно такой же как диалог открытия файлов, но предназначен для выбора папки.

    folderOpendlg.png

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

    dlgOpenFolder.exe положить рядом с батником.
    Код (DOS):
    @echo off
    SetLocal EnableExtensions

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

    Вложения:

    Последнее редактирование: 21 фев 2016
    akok и Kиpилл нравится это.

Поделиться этой страницей