来自Windows批处理脚本的文件/文件夹选择器对话框 [英] File / folder chooser dialog from a Windows batch script

查看:3060
本文介绍了来自Windows批处理脚本的文件/文件夹选择器对话框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通常,要求用户向批处理脚本提供文件名是一件麻烦的事情,不需要拼写错误,带有空格的路径引号等等。不幸的是,用户对于准确性不是众所周知的。在输入文件位置在运行时之前未知的情况下,使用GUI进行文件选择输入可减少用户错误的可能性。



是否有办法调用 File ...从Windows批处理脚本打开 style gui文件选择器或文件夹选择器?



如果脚本用户具有PowerShell或.NET安装,这是可能的。请参阅下面的答案。



我也有兴趣了解其他人可以提供什么其他解决方案。

解决方案

文件浏览器



更新2016.3.20:


$ b b

由于PowerShell是现在几乎所有现代Windows安装的本地组件,我宣布不再需要C#fallback。如果您仍然需要Vista或XP兼容性,请。)请参阅文档中可以设置的其他属性,例如 RootFolder 。我的原始.NET System.Windows.Forms PowerShell和C#解决方案可以在如果需要的话,这个答案的版本4 ,但这个COM方法更容易阅读和维护。


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.

解决方案

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
:: http://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.

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
:: http://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.

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.

这篇关于来自Windows批处理脚本的文件/文件夹选择器对话框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆