How can I use the common Save As dialog from VBScript?

后端 未结 9 1768
野性不改
野性不改 2020-12-03 07:50

I\'d like to have my VBScript display the Windows Save As dialog box, but I could not find out how to do it.

Using this code:

Dim sfd
Set sfd = Creat         


        
相关标签:
9条回答
  • 2020-12-03 08:02
    Private Sub cmdB1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdB1.Click
        Dim objExec, strMSHTA, wshShell, SelectFile
    
        SelectFile = ""
    
        ' For use in HTAs as well as "plain" VBScript:
        strMSHTA = "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>"""
    
        wshShell = CreateObject("WScript.Shell")
        objExec = wshShell.Exec(strMSHTA)
    
        SelectFile = objExec.StdOut.ReadLine()
        Me.txtT0.Text = SelectFile
        objExec = Nothing
        wshShell = Nothing
        strMSHTA = Nothing
    End Sub
    
    0 讨论(0)
  • 2020-12-03 08:11

    On http://blogs.msdn.com/b/gstemp/archive/2004/02/18/75600.aspx there is a way descibed how to show an Save As dialog from VBScript.

    Note that according to http://www.eggheadcafe.com/software/aspnet/29155097/safrcfiledlg-has-been-deprecated-by-microsoft.aspx SAFRCFileDlg has been deprecated by Microsoft.

    0 讨论(0)
  • 2020-12-03 08:12

    If you have some degree of control over the systems on which you'll be deploying this, and can be reasonably certain that they have either Visual Studio or Microsoft HTML Help installed, you can use code like the following:

    function filedialog(filt, def, title, save)
        set dialog = CreateObject("MSComDlg.CommonDialog")
        dialog.MaxFileSize = 256
        if filt = "" then
            dialog.Filter = "All Files (*.*)|*.*"
        else
            dialog.Filter = filt
        end if
        dialog.FilterIndex = 1
        dialog.DialogTitle = title
        dialog.InitDir = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
        dialog.FileName = ""
        if save = true then
            dialog.DefaultExt = def
            dialog.Flags = &H800 + &H4
            discard = dialog.ShowSave()
        else
            dialog.Flags = &H1000 + &H4 + &H800
            discard = dialog.ShowOpen()
        end if
        filedialog = dialog.FileName
    end function
    

    Also, adapting one of the other answers to this question into VBScript code (thanks @oddacorn!), you should add this function if you aren't reasonably certain that your users will have VS or HTML Help. Call this function on program startup. Don't worry if you already have the key; in that case, this has no effect. This should work on a standard user account without admin rights.

    'Make the MSComDlg.CommonDialog class available for use. Required for filedialog function.
    function registerComDlg
        Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")
        objRegistry.CreateKey &H80000001, "Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905"
        objRegistry.SetStringValue &H80000001, "Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905", "", "gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj"
    end function
    

    Note that I adapted the filedialog function from the "View Source" of the VBScript code in the HTML here; on modern web browsers, it appears that the HTML they use to render the code samples doesn't display correctly (tested on IE 8 and Chrome). But fortunately the code is still there in the View Source.

    I found one thing that was critical to making this work on Windows 7 (SP1, fully patched); you must set dialog.MaxFileSize = 256 or you will get a run-time error.

    That is, the following code fails on Windows 7 SP1, but probably works on older versions of Windows:

    Set x = CreateObject("MSComDlg.CommonDialog")
    x.ShowSave
    
    0 讨论(0)
  • 2020-12-03 08:12
    Set objDialog = CreateObject( "SAFRCFileDlg.FileSave" )
    
    ' Note: If no path is specified, the "current" directory will
    '       be the one remembered from the last "SAFRCFileDlg.FileOpen"
    '       or "SAFRCFileDlg.FileSave" dialog!
    objDialog.FileName = "test_save.vbs"
    ' Note: The FileType property is cosmetic only, it doesn't
    '       automatically append the right file extension!
    '       So make sure you type the extension yourself!
    objDialog.FileType = "VBScript Script"
    If objDialog.OpenFileSaveDlg Then
        WScript.Echo "objDialog.FileName = " & objDialog.FileName
    End If
    
    0 讨论(0)
  • 2020-12-03 08:19

    I just made a shell, linked it to a asp website, made the website read a directional tag - which i loaded the file location into, and the asp page opens up the file dialog immediate within that file location, with the filename also specificed through directional tags. Once saved, the shell disappears.

    If it's a limitation of the website direcitonal tags ie (blah.com/temp.aspx?x=0&y=2&z=3)

    store the information in a SQL db, or flat files, there are a ton of workarounds, but what above is said is true. VBS won't cut it internally.

    0 讨论(0)
  • 2020-12-03 08:20

    After looking for ages, I've found jsShell - Shell Component at jsware.net. The zip file contains jsShell.dll 176 kB, a vbscript to register the dll basically regsvr32.exe jsShell.dll, demo scripts and clear documentation.

    The DLL works well in Windows 7 and provides several useful methods, including the Open/Save dialog:

    Dim jsS, sFileName
    jsS = CreateObject("jsShell.Ops")
    ' Save as dialog
    sFileName = jsS.SaveDlg("<title>", "exe") ' Example: Filter by exe files
    sFileName = jsS.SaveDlg("<title>", "")    ' Example: No extension filter
    ' Open dialog
    ' Example: Filter by exe, initial dir at C:\
    sFileName = jsS.OpenDlg("<title>", "exe", "C:\")
    

    When no file is selected, sFileName is an empty string.

    0 讨论(0)
提交回复
热议问题