Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File / folder chooser dialog from a Windows batch script

Typically, asking the user to supply a file name to a batch script is a messy affair, requiring no misspellings, quotes around paths with spaces, and so forth. Unfortunately, users aren't well-known for accuracy. In situations where input file location is not known until runtime, using a GUI for file selection input reduces the likelihood of user error.

Is there a way to invoke a File... Open style gui file chooser or folder chooser from a Windows batch script?

If the script user has PowerShell or .NET installed, it is possible. See the answer below.

I'm also interested to see what other solutions anyone else can offer.

like image 222
rojo Avatar asked Apr 08 '13 17:04

rojo


People also ask

What is %% A in batch script?

Use double percent signs ( %% ) to carry out the for command within a batch file. Variables are case sensitive, and they must be represented with an alphabetical value such as %a, %b, or %c. ( <set> ) Required. Specifies one or more files, directories, or text strings, or a range of values on which to run the command.

What is %1 in a batch file?

When used in a command line, script, or batch file, %1 is used to represent a variable or matched string. For example, in a Microsoft batch file, %1 can print what is entered after the batch file name.


2 Answers

File Browser

Update 2016.3.20:

Since PowerShell is a native component of pretty much all modern Windows installations nowadays, I'm declaring the C# fallback as no longer necessary. If you still need it for Vista or XP compatibility, I moved it to a new answer. Starting with this edit, I'm rewriting the script as a Batch + PowerShell hybrid and incorporating the ability to perform multi-select. It's profoundly easier to read and to tweak as needed.

<# : chooser.bat :: launches a File... Open sort of file chooser and outputs choice(s) to the console :: https://stackoverflow.com/a/15885133/1683264  @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 } 

This results in a file chooser dialog.

file chooser

The result of a selection outputs You chose C:\Users\me\Desktop\tmp.txt to the console. If you want to force single file selection, just change the $f.Multiselect property to $false.

(PowerShell command mercilessly leeched from the Just Tinkering Blog.) See the OpenFileDialog Class documentation for other properties you can set, such as Title and InitialDirectory.


Folder Browser

Update 2015.08.10:

Since there is already a COM method for invoking a folder chooser, it's pretty easy to build a PowerShell one-liner that can open the folder chooser and output the path.

:: 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 

In the BrowseForFolder() method, the fourth argument specifies the root of the hierarchy. See ShellSpecialFolderConstants for a list of valid values.

This results in a folder chooser dialog.

enter image description here

The result of a selection outputs You chose C:\Users\me\Desktop to the console.

See the FolderBrowserDialog class documentation for other properties you can set, such as RootFolder. My original .NET System.Windows.Forms PowerShell and C# solutions can be found in revision 4 of this answer if needed, but this COM method is much easier to read and maintain.

like image 88
rojo Avatar answered Sep 21 '22 13:09

rojo


This should work from XP upwards and does'nt require an hibrid file, it just runs mshta with a long command line:

@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 
like image 28
Antoni Gual Via Avatar answered Sep 20 '22 13:09

Antoni Gual Via