本文记录,VBScript 中,各种打开 “文件选择对话框” 的方法。

实现方法-1 (mshta.exe):

首先,我们要实现的就是,弹出上面的这个“文件选择对话框”。

这种方法是通过,Shell 对象,打开 mshta.exe 程序,执行一个 .hta 文件,从而打开窗口,

这种方法,其实是写了一个简单的 hta (HTML Applicaiton) 文件,

然后,这个 hta 文件,打开了 “选择文件对话框”,代码如下:


'打开对话框
Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""") '输出选择的,文件的路径
File_Selected = oExec.StdOut.ReadLine
MsgBox File_Selected

实现方法-2 (InternetExplorer.Application):

这种方法是通过,InternetExplorer.Application 对象来实现的,

先创建一个 IE 的对象,然后写一个 HTML 文件,然后执行这个文件,从而打开窗口,

这种方法,虽然调用的对象,和方法1不同,但其根本原理和方法1,是完全一样的,


'打开对话框
Set IE = CreateObject("InternetExplorer.Application")
With IE
.Visible = False
.Navigate("about:blank")
Do Until .ReadyState = 4 : Loop
With .Document
.Write "<html><body><input id='f' type='file'></body></html>"
With .All.f
.Focus
.Click
Result = .Value
End With
End With
.Quit
End With
Set IE = Nothing '输出选择的,文件的路径
File_Selected = Result
MsgBox File_Selected

实现方法-3 (Excel.Application):

这种方法是通过,Excel.Application 对象来实现的,

是通过 Excel Object 自带的,GetOpenFilename 方法,直接打开的对话框,

个人觉得,这个方法是最方便的,代码如下:


'打开对话框
Set oExcel=CreateObject("Excel.Application")
FileFilter = "CSV Files (*.csv),*.csv"
FilterIndex = default
Title = ""
ButtonText = ""
MultiSelect = False
File_Selected= oExcel.GetOpenFilename (FileFilter, FilterIndex, Title, ButtonText, MultiSelect) '输出选择的,文件的路径
MsgBox File_Selected

实现方法-4 (Excel.Application):

这种方法是通过,Excel.Application 对象来实现的,

是通过 Excel Object 自带的,FileDialog 方法,直接打开的对话框,

另外,这种方法,是支持选择多个文件的,多选的时候,返回的是一个 Array,

这就是,为什么你看到 FileDialog.SelectedItems(1) 这段代码结尾有个 (1),代表选择了第一个 Item,

还有,这是这种方法,是要提前设置常量的,一共四种常量,对应四种不同的窗口,

这种方法,本质上来源于 VBA,所以,方法3和方法4,在 VBA 里也可以使用,

我个人比较喜欢,这种方法,因为看上去很清晰,而且可以设置初始路径,很方便,


'设置常量
Const msoFileDialogOpen = 1
Const msoFileDialogSaveAs = 2
Const msoFileDialogFilePicker = 3
Const msoFileDialogFolderPicker = 4 '打开对话框
Set oExcel = CreateObject("Excel.Application")
Set FileDialog = oExcel.FileDialog(msoFileDialogFilePicker) '添加筛选条件
FileDialog.Filters.Add "Images", "*.gif; *.jpg; *.jpeg", 1 '设置初始路径
FileDialog.InitialFileName = "C:\" '弹出对话框
FileDialog.show() '输出选择的,文件的路径
File_Selected = FileDialog.SelectedItems(1)
MsgBox File_Selected

实现方法-5 (Word.Application):

这种方法和上面的方法是完全一样的,

只是使用的是,Word.Application 对象而已,

所以,可以推测,微软的办公套件对象,应该都可以用来实现这个功能,


'设置常量
Const msoFileDialogOpen = 1
Const msoFileDialogSaveAs = 2
Const msoFileDialogFilePicker = 3
Const msoFileDialogFolderPicker = 4 '打开对话框
Set oWord = CreateObject("Word.Application")
Set FileDialog = oWord.FileDialog(msoFileDialogFilePicker) '设置初始路径
FileDialog.InitialFileName = "C:\" '弹出对话框
FileDialog.show() '输出选择的,文件的路径
File_Selected = FileDialog.SelectedItems(1)
MsgBox File_Selected

实现方法-6 (Scripting.FileSystemObject):

这种方法,就不去详细说明了,因为其根本原理,其实和方法1,方法2,是一样的,

只不过是,调用的 Object 不同而已,但,也列出来供大家参考,


Function BrowseForFile()
With CreateObject("WScript.Shell")
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim tempFolder : Set tempFolder = fso.GetSpecialFolder(2)
Dim tempName : tempName = fso.GetTempName() & ".hta"
Dim path : path = "HKCU\Volatile Environment\MsgResp"
With tempFolder.CreateTextFile(tempName)
.Write "<input type=file name=f>" & _
"<script>f.click();(new ActiveXObject('WScript.Shell'))" & _
".RegWrite('HKCU\\Volatile Environment\\MsgResp', f.value);" & _
"close();</script>"
.Close
End With
.Run tempFolder & "\" & tempName, 1, True
BrowseForFile = .RegRead(path)
.RegDelete path
fso.DeleteFile tempFolder & "\" & tempName
End With
End Function MsgBox BrowseForFile

实现方法-7 (Shell.Application):

这种方法呢,算是 VBScript 最本土的方法了,

没有调用任何第三方的 Object,只用了自己自带的 Shell.Application 对象,

但是,其实这种方法,只能选择文件夹,虽然确实能看到所有文件,但是要是真选了,就会报错!

但是,网上还是有人,在这种基础上做出了改进,也变得能够选择文件,并且返回文件路径,


Function BrowseForFile()
Dim shell : Set shell = CreateObject("Shell.Application")
Dim file : Set file = shell.BrowseForFolder(0, "Choose a file:", &H4000, "C:\")
BrowseForFile = file.self.Path
End Function MsgBox BrowseForFile

实现方法-8 (MSComDlg.CommonDialog):

其实,这才是最古老的方法,看上去十分的简洁,好用,

但是,注意,这是 Windows XP 时代的代码,现在 Windows 7 已经不支持了,

当然,你是可以想办法让 Windows 7 支持,这个 Object,

如果有人,对这种古老的方法感兴趣,就去看我的参考阅读吧,

但是,很麻烦,几乎不太值得了,所以,放在这,作为个借鉴吧,


Set oDialog = CreateObject("MSComDlg.CommonDialog") With oDialog
.Filter = "*.txt"
.InitDir = "C:"
.MaxFileSize = 256
.Flags = &H80000 + &H4 + &H8
End With MsgBox oDialog.FileName

实现方法-9 (UserAccounts.CommonDialog):

这是另一个古老的方法,看上去十分的简洁,同样是 Windows XP 时代的代码,

现在 Windows 7 已经不支持了,放在这,作为个借鉴吧,

我也没办法测试这两个方法,因为我没有 XP 系统,

<br>

'Set oDialog = CreateObject("UserAccounts.CommonDialog")

oDialog.Filter = "Text Files|*.txt|All Files|*.*"
oDialog.FilterIndex = 1
oDialog.InitialDir = "C:\Program Files"
Result = oDialog.ShowOpen MsgBox oDialog.FileName

篇尾总结

我个人比较喜欢,方法4,方便清晰,又简洁。

这篇文章差不多囊括了所有常见的 “文件选择对话框” 的实现方法。

如果,以后再发现新的方法了,再来更新!

希望对使用 VBScript 的人有帮助。

参考阅读:

  1. VBA - VBScript to open a dialog to select a filepath - Stack Overflow
  2. Windows7 VBScript open file dialog box - fakepath
  3. VBA Files & Directories - Application.GetOpenFileName
  4. Application.GetOpenFilename method (Excel) | Microsoft Docs
  5. MsoFileDialogType enumeration (Office) | Microsoft Docs
  6. FileDialog members (Office) | Microsoft Docs
  7. How to browse for a file in Windows 7
  8. VBScript File Browser · GitHub
  9. Windows 7 Replacement for UserAccounts.CommonDialog in VBScript

VBScript - 弹出“文件选择对话框”方法大全!的更多相关文章

  1. layui文件上传中如何先判断后再弹出文件选择框

    前言:layui中的上传,如何在点击上传按钮前阻止file的默认打开文件选择框呢?我想点击后先判断下,如果判断结果不符合,就直接弹出提示框,而不是文件选择框,判断符合才进行文件选择.但是在layui的 ...

  2. 怎么直接让火狐输入json数据,而不是弹出文件保存对话框?

    一.问题再现: 我需要浏览器输出的是json数据,但是浏览器弹出的是一个文件保存的对话框,这样的体验有点差.所以想怎么让浏览器直接输出到浏览器的页面上面,并且格式的输出,还可以编辑. 测试数据: ht ...

  3. js点击某个图标或按钮弹出文件选择框

    <HTML> <head> <script type="text/javascript" src="script/jquery-1.6.2. ...

  4. <转>Android开发使输入框点击弹出日期选择对话框的方法

    非常简单直接上代码: 转自:http://blog.sina.com.cn/s/blog_4ac1b5f60102vgnx.html final EditText et1=(EditText)find ...

  5. ionicPopup弹出列表选择对话框

    //显示vm.selectWarehouse = function() { vm.popupForWarehouse = $ionicPopup.show({ template: '<div c ...

  6. Asp.net点击按钮弹出文件夹选择框的实现(网页)

    本文地址:http://www.cnblogs.com/PiaoMiaoGongZi/p/4092112.html 在Asp.net网站实际的开发中,比如:需要实现点击一个类似于FileUpload的 ...

  7. CAD打开文件总是弹出要求选择字体怎么办

    CAD打开文件总是弹出要求选择字体怎么办1.在C:\Documents and Settings\下搜索acad.fmp文件,双击用记事本打开acad.fmp文件,在最后添加内容,上面几行本来就有,不 ...

  8. EasyUI 对话框弹出文件输入框

    目前用的EasyUI的dialog,要实现弹出文件输入框(或者其他输入框和对话框),我的实现方案是,首先写一个close的div,然后里面就是样式和输入框的一些代码和一个确定按钮,然后页面上一个按钮, ...

  9. 在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法

    在使用Ajax请求返回json数据的时候IE浏览器弹出下载保存对话框的解决方法 最近在做一个小东西,使用kindeditor上传图片的时候,自己写了一个上传的方法,按照协议规则通过ajax返回json ...

随机推荐

  1. Simulink仿真入门到精通(六) Simulink模型保存为图片

    6.1 截图保存方式 Ctrl+Alt+A 6.2 拷贝试图方式 Edit→Copy Current View to Clipboard 6.3 saveas函数 用于保存figure或者simuli ...

  2. C语言程序设计(七) 函数

    第七章 函数 分而治之: 把较大的任务分解成若干较小.较简单的任务,并提炼出公用任务的方法 函数是C语言中模块化程序设计的最小单位,既可以把每个函数都看作一个模块,也可以将若干相关的函数合并成一个模块 ...

  3. [JS]使用JavaScript实现简易俄罗斯方块

    [JS]使用JavaScript实现简易俄罗斯方块 首先,大家可以点击此处来预览一下游戏效果,随后将会以此为模板讲解如何使用JavaScript实现这样一个简易的俄罗斯方块项目(以下简称"该 ...

  4. Java多线程并发02——线程的生命周期与常用方法,你都掌握了吗

    在上一章,为大家介绍了线程的一些基础知识,线程的创建与终止.本期将为各位带来线程的生命周期与常用方法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程生命周期 一个线程不是被创建了 ...

  5. USB概述及协议基础

    USB概述及协议基础 USB的拓扑结构 USB是一种主从结构的系统.主机叫做Host,从机叫做Device(也叫做设备). 通常所说的主机具有一个或者多个USB主控制器(host controller ...

  6. centos7安装部署opentsdb2.4.0

    写在前面 安装HBase 在HBase中创建表结构 安装配置并启动opentsdb 写在前面 最近因为项目需要在读opentsdb的一部分源码,后面会做个小结分享出来.本人是不大喜欢写这种安装部署的文 ...

  7. Head First设计模式——原型模式和访问者模式

    原型 原型模式:当创建给定类的过程很昂贵或很复杂时,就使用原型模式. 我们在进行游戏的时候游戏会动态创建怪,而怪时根据场景的不同而变化创建的,英雄自己也会创建一些随从.创建各式各样的怪兽实例,已经越来 ...

  8. [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列

    [剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...

  9. Django之模板层细说

    django的模板层,基于我们前面学习的内容,也知道主要语法是{{变量相关}}{%逻辑相关%},那么具体还有哪些内容呢?且听我娓娓道来. 模板层(模板语法) 标签 过滤器 自定义标签,过滤器,incl ...

  10. select_related prefetch_related

    # select_related与prefetch_related# # select_related帮你直接连表操作 查询数据 括号内只能放外键字段# # res = models.Book.obj ...