【问题标题】:VBScript file or folder selectionVBScript 文件或文件夹选择
【发布时间】:2015-04-22 07:49:45
【问题描述】:

我有一个包含几个 vbs 代码的小 hta 文件。它选择文件夹或文件,然后复制到固定位置。

<html>
<head>
<Title>File Copy </Title>
<style>
img.exco
{
position:absolute;
bottom:10px;
right:10px
}
</style>
<!--Put this sub here to avoid resize flickering.-->
<script language = "VBScript">
 sub DoResize
    'resize   
    window.resizeTo 690,350
    screenWidth = Document.ParentWindow.Screen.AvailWidth
    screenHeight = Document.ParentWindow.Screen.AvailHeight
    posLeft = (screenWidth - 700) / 2
    posTop = (screenHeight - 430) / 2     
    'move to centerscreen
    window.moveTo posLeft, posTop

  end sub

DoResize()
</script>

<HTA:APPLICATION ID=""
   applicationName=""
   version="1.1"
    BORDER="thin"
    BORDERSTYLE="static"
    CAPTION="Yes"
    CONTEXTMENU="no"
    ICON="C:\icon\32x32.ico"
    INNERBORDER="no"
    MAXIMIZEBUTTON="no"
    MINIMIZEBUTTON="no"
    NAVIGATABLE="no"
    SCROLL="no"
    SCROLLFLAT="no"
    SELECTION="no"
    SHOWINTASKBAR="yes"
    SINGLEINSTANCE="yes"
    SYSMENU="yes"
    WINDOWSTATE="normal" 
>

<script language = "VBScript">


Sub BrowseSource_OnClick()
    strStartDir = "K:\Data\"
    Copy_To_PC.txtFile.value = PickFolder(strStartDir)
End Sub 

Function PickFolder(strStartDir)
Dim shell : Set shell = CreateObject("Shell.Application")
Dim file : Set file = shell.BrowseForFolder(0, "Choose a file:", &H4000)
If (Not File Is Nothing) Then
PickFolder = file.self.Path
End If
Set shell = Nothing
Set file = Nothing

End Function

Sub RunScripts_OnClick()
    Copy
    Paste
    OpenWord
End Sub

Sub Copy
End Sub

Sub Paste
            msgBox "Copy Success!"           
End Sub

Sub OpenWord      
End Sub
</script>
</head>
<body>
<p><b><font size="4">Please select the file.</font></b></p>
<form name="Copy_To_PC">
<input type = "text" name = "txtFile" size="100" />
<input type = "button" value = "File Source" Name="BrowseSource">
<input type="button" value="Copy and Paste" name="RunScripts">
</form>
</body>
</html>

单击第一个按钮时,我在选择项目(文件夹或文件)时遇到问题。

  1. 它可以很好地拾取文件夹,但在选择文件时,我收到“第 60 行未指定错误”,请帮助我解决问题。我希望文件浏览器窗口像现在一样,上面有 OK 按钮,而不是“打开”按钮,所以我可以选择文件夹或文件。

  2. 此外,文件浏览器也不会从我设置的位置启动。 如何解决?

【问题讨论】:

  • 你传入了 strStartDir 但不使用它,这就是它没有在你指定的位置打开的原因。将 &h4000 替换为您的 strStartDir 以使其打开该位置。也不要使用计数到第 60 行,你应该知道这已经是哪一行了,所以指出来。
  • 之前试过,结果是“Line: 60 Error: Type mismatch: 'shell.BrowseForFolde”...我找不到在同一个对话框窗口中同时选择文件夹和文件的方法
  • 我可以重现该错误,当您在BrowseForFolder() 对话框中选择文件而不是文件夹时似乎会发生此错误。不知道如何解决这个问题(或者即使它可以完全修复)。要传递根路径,您必须将其添加为 last 参数,即 &amp;H400.
  • @Tomalak 感谢您的提示,我在&amp;H400 之后添加了路径,它起作用了。现在只需要找到一种方法来提取文件......
  • 或者有没有办法指定文件类型?假设我只想看到.rtm(如果存在)

标签: vbscript hta


【解决方案1】:
<!-- :: Batch section
@echo off
setlocal

echo Select an option:
for /F "delims=" %%a in ('mshta.exe "%~F0"') do set "HTAreply=%%a"

tasklist /fi "imagename eq iexplore.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "iexplore.exe"

echo End of HTA window, reply: "%HTAreply%"
Echo hi...
echo %HTAreply%
call installation.cmd

-->


<HTML>
<HEAD>
<HTA:APPLICATION SCROLL="no" SYSMENU="no" >

<TITLE>Your Project Folder </TITLE>
<SCRIPT language="JavaScript">
window.resizeTo(440,170);

function validateForm() {
var x=document.forms["myForm"]["pname"].value;
if(x==""){
return false;
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.GetStandardStream(1).WriteLine(x);
 window.close();
  }
  function selectPath() {

var objShell = new ActiveXObject("shell.application");
    var objFolder;

    objFolder = objShell.BrowseForFolder(0, "Example", 0, 0);
    if(objFolder){
    document.forms["myForm"]["pname"].value = objFolder.Self.Path;
    }
}
</SCRIPT>

</HEAD>
<BODY>
<form name="myForm" onsubmit="return validateForm()">
pathtostore: <input type="text" name="pname" value="c:\program files">              
<input type="button" onclick="selectPath()" value="Browse">
<br>
<br>
<input type="submit" value="ok">
</form>
</BODY>
</HTML>

【讨论】:

  • 使用上面的代码获取 test.cmd 文件并在命令提示符下运行并查看结果。谢谢你。
【解决方案2】:

第一个代码示例的 HTA 部分实际上存在一个错误,这会导致一些问题。标签上写着 NAVIGATABLE="no"。它应该是 NAVIGABLE="no"。你需要输掉AT。

【讨论】:

    【解决方案3】:

    如何在同一窗口中选择文件夹或文件?通过MSDNShell.BrowseForFolder 方法创建一个对话框,使用户能够选择一个文件夹,然后返回所选文件夹的Folder 对象。

    因此,为了浏览文件,我们需要使用另一种方法。存在带有 type="file" 属性的原生 &lt;input ...&gt; 标签。但是,使用它带来的弊大于利(请参阅下面的第二个解决方案)。

    在下一个解决方案中,Browse for File 是通过使用 HtmlDlgHelper 对象来实现的 - 一个晦涩难懂且文档记录不佳的对象,但在所有 Windows 系统上都可用...与 @987654327 相比上面提到的@标签,这个解决方案提供了定义初始位置和文件类型掩码。

    <HTML>
    <HEAD>
    <Title>File/Folder Copy B</Title>
    <!-- Browse for 
          - file:   based on the HTMLDlgHelper class 
                    registered via C:\Windows\System32\mshtmled.dll
                    (.OpenFileDlg returns string)
          - folder: based on the Shell.BrowseForFolder method
                    (returns the selected folder's Folder object)
    -->
    <HTA:APPLICATION 
        ID=""
        APPLICATIONNAME="28632270ym"
        SCROLL="no"
        SINGLEINSTANCE="yes"
        WINDOWSTATE="normal"
    >
    
    <script language="VBScript">
    
    ''''''''''''''''''''''''''
    ''' Global State Variables
    ''''''''''''''''''''''''''
      Dim sStartPath, sStartFile, sFilter, sCaption
      sStartPath = "D:\Remote"
      sStartFile = sStartPath & "\nul"
      sFilter    = "All Files (*.*)|*.*|" _
          & "VBScript (*.vbs;*.vbc)|*.vbs;*.vbc|" _
          & "HTML (*.htm;*.html;*.hta)|*.htm;*.html;*.hta|"
      sCaption = "Choose a File:"
    
    Sub Window_Onload
        self.Focus()
        self.moveTo 1, 1
        self.ResizeTo 760,400
    End Sub
    
    Sub BrForFolder
        sBFF = PickFolder(sStartPath)
        If not sBFF = "" Then 
          document.Copy_To_PC.txtfile.value = sBFF
          document.Copy_To_PC.OKbuton.value = "Treat folder"
        End If
    End Sub 
    
    Sub BrForFile_onclick
        sBFF = Dlg.OpenFileDlg( CStr(sStartFile), , CStr(sFilter), CStr(sCaption))
        If not sBFF = "" Then 
          document.Copy_To_PC.txtfile.value = sBFF
          document.Copy_To_PC.OKbuton.value = "Treat file"
        End If
    End Sub 
    
    Function PickFolder(sStartPath)
        Dim shell, oFldr
        Set shell = CreateObject("Shell.Application")
        Set oFldr = shell.BrowseForFolder(0, "Choose a folder:" _
            , &H0001 + &H0004 + &H0010 + &H0020, sStartPath)
        'See MSDN "BROWSEINFO structure" for constants
        If (Not oFldr Is Nothing) Then
            PickFolder = oFldr.Self.Path
        Else
            PickFolder = ""
        End If
        Set shell = Nothing
        Set oFldr = Nothing
    End Function
    
    Sub DoFileOK()
        MsgBox document.Copy_To_PC.OKbuton.value _
            & " """ & document.Copy_To_PC.txtfile.value & """"
        document.Copy_To_PC.txtfile.value = ""
        document.Copy_To_PC.OKbuton.value = "Undefined"
    End Sub
    
    </script>
    
    </HEAD><BODY>
    <OBJECT id=Dlg classid="CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B" 
        width=0 height=0>
    </OBJECT>
    <FORM  name="Copy_To_PC">
    <p><b><font size="3">Please select a file or folder.</font></b></p>
    <input style="width:600px;" type="text" id="txtfile" name="txtfile" />
    <br>
    <input type="button" value="Browse for File..."  id="BrForFile">
    &nbsp;&nbsp;or&nbsp;&nbsp;
    <input type="button" value="Browse for Folder..." onClick=BrForFolder()>
    <br>
    <br>Action&nbsp;
    <input type="button" value="Undefined" id="OKbuton" onClick=DoFileOK()>
    <br>
    <br>Quit:&nbsp;
    <input type="button" value="All done" onClick=self.window.close()>
    </FORM></BODY></HTML>
    

    第二个解决方案:

    <html>
    <head>
    <Title>File/Folder Copy A</Title>
    <!-- based on <input type="file"> of zero width -->
    <HTA:APPLICATION 
        ID=""
        APPLICATIONNAME="28632270my"
        SCROLL="no"
        SINGLEINSTANCE="yes"
        WINDOWSTATE="normal"
    >
    
    <script language = "VBScript">
    ''''''''''''''''''''''''''
    ''' Global State Variables
    ''''''''''''''''''''''''''
      sStartPath = "D:\Remote"
      sFilter    = "application/pdf,text/plain"
    
    Sub Window_Onload
        self.Focus()
        self.moveTo 1, 1
        self.ResizeTo 960,400
    End Sub
    
    Sub BrForFolder()
        sBFF = PickFolder(sStartPath)
        If sBFF = "" Then
          'do not overwrite .txtfile.value with an empty string  
        Else
          Copy_To_PC.txtfile.value = sBFF
          Copy_To_PC.OKbuton.value = "Treat folder"
        End If
        'NOT possible (security reason): Copy_To_PC.fn_file.value = ""
    End Sub 
    
    Sub BrForFile()
        '??? how to know whether a user has pressed 'Open' or 'Cancel' ??? 
        'http://stackoverflow.com/a/4628563/3439404
        'The result of the file dialog is not exposed to the browser.
        '
        '??? how to set initial working directory??? 
        ' and file types??? (MSIE does not care about the accept attribute?)
        sBFF = Copy_To_PC.fn_file.value
        If sBFF = "" Then
          'do not overwrite .txtfile.value with an empty string  
        Else
          Copy_To_PC.txtfile.value = sBFF
          Copy_To_PC.OKbuton.value = "Treat file"
        End If
    End Sub 
    
    Function PickFolder(sStartPath)
        Dim shell : Set shell = CreateObject("Shell.Application")
        Dim oFldr : Set oFldr = shell.BrowseForFolder(0, "Choose a folder:" _
            , &H0001 + &H0004 + &H0010 + &H0020, sStartPath)
        'See MSDN "BROWSEINFO structure" for constants
        'Shell.BrowseForFolder method: Creates a dialog box that 
        '   enables the user to select a folder and then returns 
        '   the selected folder's Folder object.
        If (Not oFldr Is Nothing) Then
            PickFolder = oFldr.Self.Path
        Else
            PickFolder = ""
        End If
        Set shell = Nothing
        Set oFldr = Nothing
    End Function
    
    Sub DoFileOK()
        MsgBox Copy_To_PC.OKbuton.value _
            & " """ & Copy_To_PC.txtfile.value & """"
        Copy_To_PC.txtfile.value = ""
        Copy_To_PC.OKbuton.value = "Undefined"
    End Sub
    
    </script>
    
    </head><body><form  name="Copy_To_PC">
    <p><b><font size="3">Please select a file or folder.</font></b></p>
    <input style="width:600px;" type="text" id="txtfile" name="txtfile" />
    <input style="width:0px;"   type="file" id="fn_file" name="fn_file" 
        accept=sFilter onChange=BrForFile() onBlur=BrForFile()>
    &nbsp;or&nbsp; 
    <input type="button" value="...for Folder..." onClick=BrForFolder()>
    <br>
    <br>Action&nbsp;
    <input type="button" value="Undefined" id="OKbuton" onClick=DoFileOK()>
    <br>
    <br>Quit:&nbsp;
    <input type="button" value="All done" onClick=self.window.close()>
    </form></body></html>
    

    【讨论】:

    • 感谢您的出色工作。我正在考虑以相同的方式分别为文件夹和文件制作 2 个按钮。但是我被要求在一个窗口中执行此操作...您的两种解决方案都很好,我注意到当我浏览文件时,选择按钮是“打开”,如果文件夹是“确定”,我只需要一个“ OK”按钮,如果你检查我的原始代码,它可以选择文件夹和普通文件,如“txt、word、jpg、pdf”,但对于我们处理的特殊文件,它不会拾取并出现错误。你知道为什么@JosefZ
    【解决方案4】:

    这里是一个设置起始目录和文件选择的例子。

    Const GeneratedItemFlag = &h4000
    
    dim shellApp 
    dim folderBrowseDialog
    dim filePath
    set shellApp = CreateObject("Shell.Application")
    
    set folderBrowseDialog = shellApp.BrowseForFolder(0,"Select the file", GeneratedItemFlag, "c:\")
    
    
    if folderBrowseDialog is nothing then
        msgbox "No file was selected.  This will now terminate."
        Wscript.Quit
    else
        filePath= folderBrowseDialog.self.path
    end if
    

    【讨论】:

    • 谢谢,但是这个也有同样的错误。我在想可能是文件类型或扩展名的原因?因为当我使用您的代码或我的代码来获取一些常见的文件类型(如 pdf 文件或文本文件)时,根本没有错误,但当我获取一些特殊文件(如 .rms or .rtm)时,它会出错。跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2015-04-26
    相关资源
    最近更新 更多