Cuadro de diálogo de selección de archivos/carpetas desde un script por lotes de Windows
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?
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.
El resultado de una selección sale You chose C:\Users\me\Desktop\tmp.txt
a la consola. Si desea forzar la selección de un solo archivo, simplemente cambie la $f.Multiselect
propiedad a $false
.
PowerShell tomó el comando del blog Just Tinkering . Consulte la documentación OpenFileDialog
de la clase para conocer otras propiedades que puede configurar, como Title
y 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.
El resultado de una selección sale You chose C:\Users\me\Desktop
a la consola.
Consulte la documentación de la clase FolderBrowserDialog para conocer otras propiedades que puede configurar, como RootFolder
. Mis System.Windows.Forms
soluciones 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.
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
Host de secuencias de comandos de Windows
Selección de archivos
Windows XP tenía un misterioso UserAccounts.CommonDialog
objeto 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 .bat
extensió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 : '');
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.