Cuadro de diálogo de selección de archivos/carpetas desde un script por lotes de Windows

Resuelto rojo asked hace 11 años • 0 respuestas

En situaciones en las que la ubicación del archivo de entrada no se conoce hasta el tiempo de ejecución, el uso de una GUI para la entrada de selección de archivos reduce la probabilidad de error del usuario.

¿Hay alguna manera de invocar un cuadro de diálogo de selección de archivos/carpetas desde un script por lotes de Windows?

rojo avatar Apr 09 '13 00:04 rojo
Aceptado

Explorador de archivos

Actualización 2016.3.20:

Dado que PowerShell es un componente nativo de todas las instalaciones modernas de Windows hoy en día, declaro que el respaldo de C# ya no es necesario. Si aún lo necesita para compatibilidad con Vista o XP, lo moví a una nueva respuesta . A partir de esta edición, estoy reescribiendo el script como un híbrido Batch + PowerShell e incorporando la capacidad de realizar selección múltiple. Es mucho más fácil de leer y modificar según sea necesario.

<# : chooser.bat
:: launches a File... Open sort of file chooser and outputs choice(s) to the console

@echo off
setlocal

for /f "delims=" %%I in ('powershell -noprofile "iex (${%~f0} | out-string)"') do (
    echo You chose %%~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 }

Esto da como resultado un cuadro de diálogo de selección de archivos.

Diálogo de selección de archivos

El resultado de una selección sale You chose C:\Users\me\Desktop\tmp.txta la consola. Si desea forzar la selección de un solo archivo, simplemente cambie la $f.Multiselectpropiedad a $false.

PowerShell tomó el comando del blog Just Tinkering . Consulte la documentación OpenFileDialogde la clase para conocer otras propiedades que puede configurar, como Titley InitialDirectory.

Explorador de carpetas

Actualización 2015.08.10:

Dado que ya existe un método COM para invocar un selector de carpetas , es bastante fácil crear un resumen de PowerShell que pueda abrir el selector de carpetas y generar la ruta.

:: fchooser.bat
:: launches a folder chooser and outputs choice to the console
:: https://stackoverflow.com/a/15885133/1683264

@echo off
setlocal

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"

setlocal enabledelayedexpansion
echo You chose !folder!
endlocal

En el BrowseForFolder()método, el cuarto argumento especifica la raíz de la jerarquía. Consulte ShellSpecialFolderConstants para obtener una lista de valores válidos.

Esto da como resultado un cuadro de diálogo de selección de carpeta.

ingrese la descripción de la imagen aquí

El resultado de una selección sale You chose C:\Users\me\Desktopa la consola.

Consulte la documentación de la clase FolderBrowserDialog para conocer otras propiedades que puede configurar, como RootFolder. Mis System.Windows.Formssoluciones originales de .NET PowerShell y C# se pueden encontrar en la revisión 4 de esta respuesta si es necesario, pero este método COM es mucho más fácil de leer y mantener.

rojo avatar Apr 08 '2013 17:04 rojo

Esto debería funcionar desde XP en adelante y no requiere un archivo híbrido, simplemente ejecuta mshta con una línea de comando larga:

@echo off
set dialog="about:<input type=file id=FILE><script>FILE.click();new ActiveXObject
set dialog=%dialog%('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);
set dialog=%dialog%close();resizeTo(0,0);</script>"

for /f "tokens=* delims=" %%p in ('mshta.exe %dialog%') do set "file=%%p"
echo selected  file is : "%file%"
pause
Antoni Gual Via avatar May 06 '2016 19:05 Antoni Gual Via

Host de secuencias de comandos de Windows


Selección de archivos

Windows XP tenía un misterioso UserAccounts.CommonDialogobjeto WSH que permitía a VBScript y JScript iniciar el mensaje de selección de archivos. Aparentemente, eso se consideró un riesgo de seguridad y se eliminó en Vista.


Selección de carpeta

Sin embargo, el método BrowseForFolder del objeto WSH Shell.Application seguirá permitiendo la creación de un cuadro de diálogo de selección de carpeta. Aquí hay un ejemplo de lote híbrido + JScript. Guárdalo con una .batextensión.

@if (@a==@b) @end /*

:: fchooser2.bat
:: batch portion

@echo off
setlocal

for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0"') do (
    echo You chose %%I
)

goto :EOF

:: JScript portion */

var shl = new ActiveXObject("Shell.Application");
var folder = shl.BrowseForFolder(0, "Please choose a folder.", 0, 0x00);
WSH.Echo(folder ? folder.self.path : '');

cuadro de diálogo de selección de carpeta

En el BrowseForFolder()método, el cuarto argumento especifica la raíz de la jerarquía. Consulte ShellSpecialFolderConstants para obtener una lista de valores válidos.

rojo avatar Apr 09 '2013 16:04 rojo