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
Работает в неверной кодировке (если выбрать файл с русскими символами).
Если Вы не против, я его немного проапгрейдил 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
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
FolderOpenDialog
- по виду точно такой же как диалог открытия файлов, но предназначен для выбора папки.
На основе программы (.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