可编写脚本的 Shell 对象

Windows Shell 提供了一组功能强大的自动化对象,使你能够使用 Microsoft Visual Basic 和脚本语言(如 Microsoft JScript (与 ECMA 262 语言规范) 和 Microsoft Visual Basic Scripting Edition (VBScript) 兼容)对 Shell 进行编程。 可以使用这些对象访问 Shell 的许多功能和对话框。 例如,可以访问文件系统、启动程序和更改系统设置。

本部分介绍可编写脚本的 Shell 对象。

Shell 版本

许多 Shell 对象在 Shell 4.71 版 中可用。 其他版本在版本 5.00 及更高版本中可用。 版本 5.00 在 Windows 2000 中可用。 下表列出了该对象可用的 Shell 版本下的每个 Shell 对象。

版本 4.71 版本 5.00
文件夹 DIDiskQuotaUser
FolderItemVerb DiskQuotaControl
FolderItemVerbs Folder2
Shell FolderItem
ShellFolderView FolderItems
ShellUIHelper FolderItems2
ShellWindows IShellDispatch2
WebViewFolderContents IShellLinkDual2
ShellFolderItem
ShellFolderViewOC
ShellLinkObject

 

实例化 Shell 对象

若要使用早期绑定实例化 Visual Basic 应用程序中的 Shell 对象,请在项目中添加对以下库的引用:

  • Microsoft Internet Controls (SHDocVw)
  • Microsoft Shell 控件和自动化 (Shell32)

后期绑定

还可以使用后期绑定实例化许多 Shell 对象。 此方法适用于 Visual Basic 应用程序和脚本。 以下示例演示如何在 JScript 中实例化 Shell 对象。

<SCRIPT LANGUAGE="JScript">
<!--
    function fnCreateShell()    
    {
        // Instantiate the Shell object and invoke its FileRun method.
        var oShell = new ActiveXObject("shell.application");
        oshell.FileRun;
    }
-->
</SCRIPT>

以下示例演示如何在 VBScript 中实例化 Folder 对象。

<SCRIPT LANGUAGE="VBScript">
<!--
    function fnCreateFolder()
        dim oShell    
        dim oFolder
        dim sDir

        sDir = "C:\SomePath" 
        set oShell = CreateObject("shell.application")
        set oFolder = oShell.NameSpace(sDir)  
    end function
-->  
</SCRIPT>

在前面的示例中, sDirFolder 对象的路径。 请注意, ShellSpecialFolderConstants 枚举值在脚本中不可用。

下表显示了每个 Shell 对象的 ProgID。

Object ProgID
DIDiskQuotaUser Microsoft.DiskQuota.1
DiskQuotaControl 无法后期绑定
文件夹 壳。Shell_Application.NameSpace (“...”)
Folder2 壳。Shell_Application.NameSpace (“...”)
FolderItem 壳。Shell_Application.NameSpace (“...”) 。Self 或 Folder.Items.Item 或 Folder.ParseName
FolderItems Folder.Items
FolderItems2 Folder.Items
FolderItemVerb Shell.NameSpace (“...”) 。Self.Verbs.Item ()
FolderItemVerbs FolderItem.Verbs 或 Shell.NameSpace (“...”) 。Self.Verbs
IShellDispatch2 壳。Shell_Application
IShellLinkDual2 Shell.NameSpace (“...”) 。Self.GetLink 或 Shell.NameSpace (“...”) 。Items () 。GetLink
Shell 壳。Shell_Application
ShellFolderItem Shell.NameSpace (“...”) 。Self 或 Shell.NameSpace (“...”) 。Items ()
ShellFolderView 无法后期绑定
ShellFolderViewOC 无法后期绑定
ShellLinkObject Shell.NameSpace (“...”) 。Self.GetLink 或 Shell.NameSpace (“...”) 。Items () 。GetLink
ShellUIHelper 无法后期绑定
ShellWindows 壳。Shell_Windows或ShellWindows._NewEnum
WebViewFolderContents 无法后期绑定

 

HTML OBJECT 元素

还可以使用 OBJECT 元素在 HTML 页面上实例化 Shell 对象。 为此,请将 OBJECT 元素的 ID 属性设置为要在脚本中使用的变量名称,并使用其注册号 (CLASSID) 标识对象。 以下 HTML 使用 OBJECT 元素创建 ShellFolderItem 对象的实例。

<OBJECT ID="oShFolderItem" 
    NAME="Shell Folder Item Object"
    CLASSID="clsid:2fe352ea-fd1f-11d2-b1f4-00c04f8eeb3e">
</OBJECT>

下表列出了每个 Shell 对象及其各自的 CLASSID。

Shell 对象 CLASSID
DIDiskQuotaUser 7988B571-EC89-11cf-9C00-00AA00A14F56
DiskQuotaControl 7988B571-EC89-11cf-9C00-00AA00A14F56
文件夹 BBCBDE60-C3FF-11CE-8350-444553540000
Folder2 f0d2d8ef-3890-11d2-bf8b-00c04fb93661
FolderItem 744129E0-CBE5-11CE-8350-444553540000
FolderItems 744129E0-CBE5-11CE-8350-444553540000
FolderItems2 C94F0AD0-F363-11d2-A327-00C04F8EEC7F
FolderItemVerb 08EC3E00-50B0-11CF-960C-0080C7F4EE85
FolderItemVerbs 1F8352C0-50B0-11CF-960C-0080C7F4EE85
IShellDispatch2 A4C6892C-3BA9-11d2-9DEA-00C04FB16162
IShellLinkDual2 317EE249-F12E-11d2-B1E4-00C04F8EEB3E
Shell 13709620-C279-11CE-A49E-444553540000
ShellFolderItem 2fe352ea-fd1f-11d2-b1f4-00c04f8eeb3e
ShellFolderView 62112AA1-EBE4-11cf-A5FB-0020AFE7292D
ShellFolderViewOC 4a3df050-23bd-11d2-939f-00a0c91eedba
ShellLinkObject 11219420-1768-11d1-95BE-00609797EA4F
ShellUIHelper 64AB4BB7-111E-11D1-8F79-00C04FC2FBE1
ShellWindows 9BA05972-F6A8-11CF-A442-00A0C90A8F39
WebViewFolderContents 1820FED0-473E-11D0-A96C-00C04FD705A2

 

Shell 对象

Shell 对象表示 Shell 中的对象。 可以使用 Shell 对象公开的方法:

  • 打开、浏览和浏览文件夹。
  • 最小化、还原、级联或平铺打开的窗口。
  • 启动控制面板应用程序。
  • 显示系统对话框。

用户可能最熟悉他们从 “开始 ”菜单和任务栏的快捷菜单访问的命令。 当用户右键单击任务栏时,将显示任务栏的快捷菜单。 以下 HTML 应用程序 (HTA) 生成一个起始页,其中包含实现 许多 Shell 对象方法的按钮。 其中一些方法实现“ 开始 ”菜单和任务栏快捷菜单上的功能。

<HTML>
<HEAD>
    <TITLE>Start Page</TITLE>
    
    <OBJECT ID="oShell"
        CLASSID="clsid:13709620-C279-11CE-A49E-444553540000">
    </OBJECT>
    
    <STYLE>
        INPUT {width: 200} 
    </STYLE>  
    
    <SCRIPT LANGUAGE="VBScript">
    <!--
        function fnStart(sMethod)
            select case sMethod
              case 0    
                  'Minimizes all windows on the desktop
                oshell.Shell_MinimizeAll
              case 1  
                  'Displays the Run dialog box
                oshell.FileRun
              case 2  
                  'Displays the Shut Down Windows dialog box
                oshell.Shell_ShutdownWindows
              case 3  
                  'Displays the Find dialog box
                oshell.Shell_FindFilesr
              case 4  
                  'Displays the Date/Time dialog box
                oshell.Shell_SetTime 
              case 5  
                  'Displays the Internet Properties dialog box
                oshell.Shell_ControlPanelItem "INETCPL.cpl"
              case 6  
                  'Explores the My Documents folder
                oshell.Shell_Explore "C:\My Documents"
              case 7  
                  'Enables user to select folder from Program Files
                oshell.Shell_BrowseForFolder 0, "My Programs", 0, "C:\Program Files" 
              case 8  
                  'Opens the Favorites folder
                oshell.Shell_Open "C:\WINDOWS\Favorites"
              case 9  
                  'Displays the Taskbar Properties dialog box
                oshell.Shell_TrayProperties
            end select  
        end function      
    -->
    </SCRIPT>
</HEAD>

<BODY>
    <H1>Start...</H1>
    <INPUT type="button" value="Edit Taskbar Properties" onclick="fnStart(9)"><br>
    <INPUT type="button" value="Open Favorites Folder" onclick="fnStart(8)"><br>
    <INPUT type="button" value="Browse Program Files" onclick="fnStart(7)"><br>
    <INPUT type="button" value="Explore My Documents" onclick="fnStart(6)"><br>
    <INPUT type="button" value="Modify Internet Properties" onclick="fnStart(5)"><br>
    <INPUT type="button" value="Set System Time" onclick="fnStart(4)"><br>
    <INPUT type="button" value="Find a File or Folder" onclick="fnStart(3)"><br>
    <INPUT type="button" value="Shut Down Windows" onclick="fnStart(2)"><br>
    <INPUT type="button" value="Run" onclick="fnStart(1)">     
    <INPUT type="button" value="Minimize All Windows" onclick="fnStart(0)">     
</BODY>
</HTML>

安全性

作为应用程序,HTA 在与网页不同的安全模型下运行。 若要与实现 Shell 对象功能的网页交互,用户必须为查看页面的安全区域启用 “初始化和脚本 ActiveX 控件未标记为安全 ”选项。

文件夹对象

Folder 对象表示 Shell 文件夹。 可以使用 Folder 对象公开的方法:

  • 获取有关文件夹的信息。
  • 创建子文件夹。
  • 将文件对象复制并移动到 文件夹中。

FolderItem 对象表示 Shell 文件夹中的项。 其属性使你能够检索有关项的信息。 可以使用此对象公开的方法运行项目的谓词,或检索有关项的 FolderItemVerbs 对象的信息。

FolderItems 对象表示 Shell 文件夹中项目的集合。 其方法和属性使你能够检索有关集合的信息。

下面的 Visual Basic 示例显示了多个文件夹对象之间的关系,以及如何一起使用它们。 当用户单击名为 cmdGetPath 的命令按钮时,程序将显示一个对话框,使用户能够从“我的电脑”中选择文件夹,其中 ssfDRIVES 是“我的计算机”的 ShellSpecialFolderConstants 枚举值。 当用户选择文件夹时,文件夹的路径将显示在名为 txtPath 的文本框中。

Private Sub cmdGetPath_Click()
    Dim oShell As New Shell
    Dim oFolder As Folder
    Dim oFolderItem As FolderItem
 
    Set oFolder = oshell.Shell_BrowseForFolder(Me.hWnd, "Select a Folder", 0, ssfDrives)
   
    Set oFolderItem = oFolderItems.Item

    txtPath.Text = oFolderItem.Path
End Sub

在 VBScript 中,此函数略有不同,因为 ShellSpecialFolderConstants 枚举值在脚本中不可用。 以下示例显示了与上一个示例等效的 VBScript。

<SCRIPT LANGUAGE="VBScript">
<!--
    function fnGetMyPathVB() 
        dim oShell
        dim oFolder
        dim oFolderItem
        
        set oShell = CreateObject("shell.application")      
        set oFolder = oshell.Shell_BrowseForFolder(0, "Choose a Folder", 0)             
        set oFolderItem = oFolder.Items.Item         
        
        document.all.item("myPath").innerText = oFolderItem.Path                                
    end function
-->
</SCRIPT>

在下面的 JScript 示例中,它是上述 VBScript 示例的直接翻译,请注意如何使用空括号“ () ”来调用 ItemsItem 方法。

<SCRIPT LANGUAGE="JavaScript">
<!--
    function fnGetMyPathJ() 
    {       
        var oShell = new ActiveXObject("shell.application");
                    
        var oFolder = new Object;                   
        oFolder = oshell.Shell_BrowseForFolder(0, "Choose a folder", 0);
                                
        var oFolderItem = new Object;       
        oFolderItem = oFolder.Items().Item();                               
        
        document.all.item("myPath").innerText = oFolderItem.Path;
    }    
-->
</SCRIPT>