添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文是小编为大家收集整理的关于来自Windows批处理脚本的文件/文件夹选择器对话框的处理方法,想解了来自Windows批处理脚本的文件/文件夹选择器对话框的问题怎么解决?来自Windows批处理脚本的文件/文件夹选择器对话框问题的解决办法?来自Windows批处理脚本的文件/文件夹选择器对话框问题的解决方案?那么可以参考本文帮助大家快速定位并解决问题.

一、问题描述

通常,要求用户向批处理脚本提供文件名是一件混乱的事件,不需要拼写错误,带有空格的路径上的引号等等.不幸的是,用户并不是以准确性而闻名的.在输入文件位置直到运行时才知道的情况下,使用GUI进行文件选择输入降低了用户错误的可能性.

是否有一种方法可以从Windows批处理脚本调用File… Open样式的GUI文件选择器或文件夹选择器?

如果脚本用户已安装了PowerShell或.NET,则可能.请参阅下面的答案.

我也很想看看其他人还能提供的其他解决方案.

二、推荐答案

由于PowerShell是如今几乎所有现代Windows安装的本机组成部分,因此我将C#sholdback宣布为不再需要.如果您仍然需要它以获得Vista或XP兼容性,则i 将其移至新答案.从此编辑开始,我将脚本重写为批处理 + powershell混合动力车,并结合了执行多选择的能力.根据需要阅读和调整非常容易.

1.文件浏览器

代码如下:

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

这将导致文件选择器对话框.

file chooser

选择输出的结果You chose C:\Users\me\Desktop\tmp.txt到控制台.如果要强制单个文件选择,只需将 f.Multiselectfalse.

(PowerShell命令从 soccouthelly comment.只需修补博客.)请参阅 openfiledialog类您可以设置的其他属性的文档,例如Title和InitialDirectory.

2.文件夹浏览器

由于已经有了调用文件夹选择器,构建PowerShell One-Liner One-Liner非常容易的方法可以打开文件夹选择器并输出路径.
代码如下:

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

在BrowseForFolder()方法中,第四个参数指定层次结构的根.参见 shellspecialfoldercecialfolderconstants for for for有效值列表.

这将导致一个文件夹选择对话框.

选择输出的结果You chose C:\Users\me\Desktop到控制台.

请参阅 folderbrowserdialog class 您可以设置的其他属性,例如RootFolder.我的原始.net System.Windows.Forms PowerShell和C#解决方案可以在修订版4 如果需要的话方法更容易阅读和维护.

3.其他推荐答案

这应该从XP向上工作,并且不需要一个hibrid文件,它只是用长命令行运行mshta:

@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

其他推荐答案
Windows脚本主机

文件选择
Windows XP有一个神秘的UserAccounts.CommonDialog wsh对象允许vbscript 和jscript启动文件选择提示.显然,那是被视为安全风险并在Vista中删除.

文件夹选择
然而,wsh shell.application对象 browseforfolder 方法仍然允许创建文件夹选择对话框.这是一个混合批次 + JScript示例.用.bat扩展.

@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 : '');

在BrowseForFolder()方法中,第四个参数指定层次结构的根.参见 shellspecialfoldercecialfolderconstants for for for有效值列表.

最近适用bat文件获取某目录路径使用频率有点高。故而直接整理了一下。方法为新建一个txt文件,将后缀修改为bat。右键编辑,写入下面对应的内容后保存,放置在需要获取路径的文件夹下,双击运行就可以了。 ④、bat,获取当前路径下独立的文件名序列。这种方式应该是运用得比较多的。 dir */b >1.txt ①bat,获取某文件夹下所有文件名。 tree /f %1>%1.tx...
@echo off if "%1" == "h" goto begin mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit :begin start mshta vbscript:msgbox("    测试提示框之一    " dlg = win32ui.CreateFileDialog(1) # 参数 1 表示打开文件对话框 dlg.SetOFNInitialDir('C://') # 设置打开文件对话框中的初始显示目录 dlg.DoModal() filename = dlg.GetPathName() print(filename)
打开文件对话框相信很多人都已经懂了,那么如何通过打开对话框选择路径呢?这里就要介绍几个函数和结构体.//文件夹信息结构 typedef struct _browseinfo { HWND hwndOwner; //弹出目录对话框的父窗口 LPCITEMIDLIST pidlRoot;//ITEMIDLIST结构的地址,包含浏览时的初始根目录 //如果设为NULL则桌面目
有时候我们需要分析筛选一部分数据出来,各个文件放在不同文件夹里面,我们想要从不同的文件下筛选出来,我们可以用批处理来快速处理: 例子:我们将1文件文件名为Biz13001、Biz13002的文件及其下子文件夹文件拷贝到2文件下去。 1、首先新建一个bat批处理文件: @echo off @echo.----------------------------------------------...
$allFolder= Get-ChildItem "C:\Target" $newFolder=($allFolder|Sort-Object LastWriteTime -Descending|select -first 1).name //1. Get-ChildItem获取所有文件 //2. Sort-Object LastWriteTime -Descending 排... OPENFILENAME ofn = { 0 }; TCHAR strFilename[MAX_PATH] = { 0 };//用于接收文件名 MAX_PATH=260 ofn.lStructSize = sizeof(OPENFILENAME);//结构体大小 ofn.hwndOwner = NULL;//拥有着窗口句柄,为NULL表示对话框是非模态的,实际应用中一般都要有这个句柄 ofn.lpstrFilter = TEXT("Flie\0*.txt;\0\0");