Question

J'aimerais avoir mon écran VBScript boîte de la fenêtre Enregistrer sous, mais je ne pouvais pas savoir comment le faire.

En utilisant ce code:

Dim sfd
Set sfd = CreateObject("UserAccounts.CommonDialog")
sfd.ShowOpen

Je peux obtenir une boîte de dialogue Ouvrir, mais il n'y a pas de méthode ShowSave pour cet objet (comme il semble être un objet similaire dans la non-script Visual Basic).

Je cherchai StackOverflow et googlé pour « [vbscript] boîte de dialogue Enregistrer » (et « Windows Script Host »), mais je ne ai trouvé les discussions sur l'accès à des boîtes de dialogue communes de pages web et une solution pour le dialogue BrowseForFolder et rien vraiment à appeler la boîte de dialogue Enregistrer.

En fait, je peux utiliser la boîte de dialogue Ouvrir pour mon but, parce que tout ce que je besoin est un nom de fichier ... mais comme je voudrais sauver quelque chose sur le chemin sélectionné, un « Enregistrer sous » dans la barre de titre de la boîte de dialogue serait plus approprié.

Était-ce utile?

La solution

Je peux dire avec certitude qu'il n'y a pas de solution pour afficher la commande Enregistrer sous boîte de dialogue à partir de VBScript sous les versions de Windows autres que XP sans compter sur certaines dépendances externes que vous devez installer et vous inscrire. En plus de l'interférence évidente cette cause en ce qui concerne un outil facile, le déploiement de glisser-déposer de votre script, il apporte aussi une foule d'autres questions liées à la sécurité et les autorisations, notamment par le passage contrôle de compte sur la machine du client à installer et enregistrer une DLL de dépendance.

Les solutions qui ont été proposées jusqu'à présent reposent soit sur un fichier DLL qui se trouve juste à être inclus dans Windows XP, invoquant la boîte de commande Enregistrer sous l'utilisateur de Windows XP panneau de contrôle des comptes et / ou l'installation d'un logiciel seulement pour elle de laisser derrière la DLL MSComDlg après la désinstallation que vous pouvez utiliser à partir d'un VBScript. Aucune de ces solutions répondent vraiment aux exigences ci-dessus, et aucune des réponses fournies a même examiné les obstacles de sécurité possibles qui surgiraient avec leurs solutions proposées, comme je l'ai mentionné ci-dessus.

Et puisque vous ne pouvez pas faire des appels directement à l'API Windows (qui comprend toujours aussi facilement un tel dialogue Enregistrer sous) de VBScript (non seulement parce qu'elle présenterait un risque pour la sécurité, mais aussi à cause de VBScript est lâche [manque de?] taper), qui à peu près feuilles tous ceux qui veulent le faire dans le froid. De plus, l'incapacité de faire des appels API empêche également l'utilisation de tout hacks comme appeler SetWindowText pour modifier la légende de la boîte de dialogue Ouvrir, comme suggéré dans la question.

Je me rends compte que ce n'est pas tout le monde réponse manquait. Il est même pas la réponse que je voulais. Mais hélas, c'est la bonne réponse.

Cela étant dit, voici quelques solutions de contournement possibles:

  1. Si vous vous penchez vers l'acceptation de tout, vous avez déjà décidé des réponses déjà proposé d'introduire une dépendance externe sur un fichier DLL à votre déploiement VBScript. Une fois que vous avez fait ce saut, pourquoi la peine de « emprunter » ou autrement une DLL détournement d'une autre source? Il suffit de faire une fois vous. Il est trivial pour envelopper les fonctions natives de dialogue commun fournies par l'API Windows dans une DLL ActiveX à l'aide de Visual Basic 6, qui peut alors être appelé par votre VBScript. Les risques sont minimes, puisque presque toutes les versions modernes de Windows peut attendre d'avoir déjà l'exécution Visual Basic installé, et puisque vous savez sans doute déjà VBScript, cognant certains code dans VB 6 ne devrait pas être une entreprise très difficile. Vous pouvez inclure tout des fonctionnalités personnalisées que vous voulez, et plus important encore, vous serez en plein contrôle. Vous n'aurez pas à vous soucier des autres applications de uninstallers retirer la DLL que votre script nécessite, vous ne devrez pas Futz avec l'installation et la désinstallation de certaines applications au hasard, dépréciée, et vous ne serez pas à traverser juste vos doigts et de l'espoir. Nous savons, en tant que programmeurs, qui est jamais une bonne option.

    Et oui, je vous conseille d'emballage en fait les fonctions de dialogue communes exposées par l'API Windows, plutôt que de compter sur la boîte de dialogue commune OCX (de comdlg32.ocx) fournies par Visual Basic. Il a sa part de problèmes dans Windows 7, et il ne va pas vous obtenir les magnifiques nouvelles boîtes de dialogue que les versions ultérieures de Windows fournissent maintenant. Un excellent article expliquant tout que vous devez savoir sur l'Open et Save Common Dialog API et comment les utiliser en VB 6 est ici sur VBNET . Bien sûr, si vous voulez vraiment aller tout, il y a des tas de choses intéressantes que vous pouvez faire avec des boîtes de dialogue communes, toutes documentées (avec le code!) ici sur VB Accelerator .

  2. Mais maintenant que je vous ai tout convaincu d'écrire un DLL ActiveX dans VB 6 qui enveloppe la fonctionnalité de dialogue commune à utiliser dans votre VBScript, je dois poser la question suivante: Pourquoi arrêter là? Une fois que vous avez fait le saut à l'écriture certains code dans VB 6, pourquoi ne pas déplacer tous de votre code dans VB 6? Bien sûr, il est une langue « morte » et tout, mais ce n'est pas comme VBScript est terriblement actif soit. Comme je l'ai mentionné précédemment, la différence de syntaxe est pratiquement nulle, et la courbe d'apprentissage pour un développeur VBScript est à peu près aussi peu profonde que l'on pouvait attendre. De plus, vous obtenez tous les avantages d'un IDE complet, typage statique, (un peu) meilleure gestion des erreurs, bla bla bla. Ah oui, et être capable de faire des appels directs aux fonctions de l'API Windows. Le seul avantage réel pour VBScript est son ubiquité, mais il a été années puisque vous pouvez trouver un ordinateur sans le moteur d'exécution VB installé. Sans parler, si vous écrivez une application qui nécessite des boîtes de dialogue communes, vous vous engagez probablement dans une dialogue avec vos utilisateurs: La capacité des formes de pleine VB peut commencer à être utile à ce point. Mais peut-être le plus grand et l'avantage le plus important de choisir d'emprunter cette voie est que vous éliminez besoin d'enregistrer (ou inclure) un externe « satellite » l'application DLL simple VB 6 fonctionnera avec seulement l'EXE sur un ordinateur qui a la VB run-time installé, qui est inclus au moins à travers Windows 7.

  3. Et enfin, dans le cas où vous êtes toutes sortes de enthousiasmés par le déplacement à partir du VBScript humble au VB plein en vedette 6, je me sens obligé de jeter une clé dans l'équation: Pourquoi ne pas déplacer tout le chemin jusqu'à un langage comme VB.NET? Encore une fois, il y a toutes sortes de nouvelles fonctionnalités offertes en VB.NET grâce au .NET Framework, mais il ne devrait pas prendre plus de quelques semaines pour un développeur VB / VBScript décent pour commencer à sentir des applications d'écriture confortable dans VB.NET . Ils ne seront probablement pas avoir une compréhension complète du .NET Framework, et ils ne seront certainement pas ont développé de bonnes pratiques de conception orientées objet, mais au moins ils vont se déplacer dans la bonne direction. Presque tout ce que vous pouvez faire en VBScript (ou même VB 6), vous pouvez le faire en VB.NET. Et en général, il faut encore moins de bruit qu'auparavant, grâce à la fonctionnalité immense exposée par le .NET Framework. L'inconvénient, bien sûr, est que votre application nécessite maintenant le .NET Framework doit être installé sur l'ordinateur de l'utilisateur, ce qui est tout aussi omniprésent que le VB 6 d'exécution (bien qu'il soit beaucoup plus fréquent maintenant que même quelques années seulement il y a).

Je vous entends dire ce ne sont pas les solutions de contournement que vous espériez entendre? Oui, moi non plus. Je ne suis pas ce gars qui dit aux gens de tout laisser tomber et apprendre une nouvelle langue. Si VBScript continue à travailler pour vous, foncez . Mais si vous êtes à ce moment-là où vous commencez à rude épreuve à ses limites, il est probablement temps de faire le saut.

Autres conseils

Le secret d'utiliser la boîte de dialogue commune à partir de VBScript (ou VBA ou JScript, pour cette question) est que vous devez avoir sa licence installée sur votre machine. Certains outils de développement, tels que Visual Basic 6, installera la licence, mais il est également installé gratuitement par le Microsoft HTML Help Editor (ce qui est une application assez vieux). La chose intéressante est que si vous installez et désinstallez l'aide HTML Editor, il quitte la licence Common Dialog en place. Pour cette raison, je considère que la licence d'être librement disponible et donc inclure l'entrée de registre, il crée ici dans ma réponse:

Dans HKLM\Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905, définissez l'entrée de (Default) à gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj.

Une fois qui est en place, vous pouvez créer ces boîtes de dialogue à partir d'un code à l'aide VBScript comme ceci:

Set objDialog = CreateObject("MSComDlg.CommonDialog")

Pour lancer un dialogue d'enregistrement de fichier, utilisez la méthode de ShowSave comme dans ce code:

objDialog.ShowSave

Bien sûr, cet objet a un tas d'autres méthodes et propriétés, et vous aurez probablement envie de configurer les propriétés appropriées avant de lancer la boîte de dialogue. Par exemple, vous pouvez définir le filtre de fichier afin que certaines extensions de fichiers sont affichés dans la boîte de dialogue. Il y a une belle référence au contrôle sur le site MSDN ici: http: / /msdn.microsoft.com/en-us/library/aa259661%28v=vs.60%29.aspx .

Hope this helps. Laissez-moi savoir si vous avez des questions.

Si vous avez un certain degré de contrôle sur les systèmes sur lesquels vous déploierez cela, et peut être raisonnablement certain qu'ils ont soit Visual Studio ou Microsoft HTML Help installé, vous pouvez utiliser le code comme suit:

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

En outre, adapter l'un des autres réponses à cette question dans le code VBScript (merci @oddacorn!), Vous devez ajouter cette fonction si vous ne sont pas raisonnablement certain que vos utilisateurs auront VS ou Aide HTML. Appelez cette fonction au démarrage du programme. Ne vous inquiétez pas si vous avez déjà la clé; dans ce cas, cela n'a aucun effet. Cela devrait fonctionner sur un compte d'utilisateur standard sans droits d'administrateur.

'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

Notez que la fonction je l'ai adapté filedialog de la « Afficher la source » du code VBScript dans le code HTML ici ; sur les navigateurs web modernes, il semble que le code HTML qu'ils utilisent pour rendre les exemples de code ne s'affiche pas correctement (testé sur IE 8 et Chrome). Mais heureusement, le code est toujours là dans la vue Source.

J'ai trouvé une chose qui était critique pour faire ce travail sous Windows 7 (SP1, entièrement mis à jour); vous doit ensemble dialog.MaxFileSize = 256 ou vous obtiendrez une erreur d'exécution.

Ainsi, le code suivant échoue sur Windows 7 SP1, mais fonctionne probablement sur les anciennes versions de Windows:

Set x = CreateObject("MSComDlg.CommonDialog")
x.ShowSave

http://blogs.msdn.com/b/gstemp /archive/2004/02/18/75600.aspx il y a une façon comment correct de montrer une boîte de dialogue Enregistrer sous VBScript.

Notez que selon http://www.eggheadcafe.com /software/aspnet/29155097/safrcfiledlg-has-been-deprecated-by-microsoft.aspx SAFRCFileDlg a été désapprouvée par Microsoft.

Je viens de faire une coquille, il est lié à un site Web asp, a fait le site lire une étiquette directionnelle - qui i chargé l'emplacement du fichier dans, et la page asp ouvre la boîte de dialogue de fichier immédiat dans cet emplacement de fichier, le nom de fichier également specificed grâce à des balises directionnelles. Une fois enregistré, le shell disparaît.

Si c'est une limitation du site balises direcitonal ie (blah.com/temp.aspx?x=0&y=2&z=3)

stocker les informations dans une base de données SQL ou des fichiers plats, il y a une tonne de solutions de contournement, mais ce qui est dit ci-dessus est vrai. VBS ne sera pas coupé en interne.

Après avoir cherché les âges, j'ai trouvé JSShell - composant Shell à jsware.net. Le fichier zip contient jsShell.dll 176 kB , un vbscript pour enregistrer la dll essentiellement regsvr32.exe jsShell.dll , les scripts de démonstration et documentation claire .

La DLL fonctionne bien dans Windows 7 et propose plusieurs méthodes utiles, y compris la boîte de dialogue Ouvrir / Enregistrer:

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:\")

Si aucun fichier est sélectionné, sFileName est une chaîne vide.

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

Je viens de trouver une solution dans ce site Il est entièrement commenté et fonctionne bien dans Windows 10

Voici le code qui renvoie le dossier sous forme de chaîne (j'ai essayé dans trois dossiers de départ différents):

Option Explicit

WScript.Echo BrowseFolder( "C:\Program Files", True )
WScript.Echo BrowseFolder( "My Computer", False )
WScript.Echo BrowseFolder( "", False )


Function BrowseFolder( myStartLocation, blnSimpleDialog )
' This function generates a Browse Folder dialog
' and returns the selected folder as a string.
'
' Arguments:
' myStartLocation   [string]  start folder for dialog, or "My Computer", or
'                             empty string to open in "Desktop\My Documents"
' blnSimpleDialog   [boolean] if False, an additional text field will be
'                             displayed where the folder can be selected
'                             by typing the fully qualified path
'
' Returns:          [string]  the fully qualified path to the selected folder
'
' Based on the Hey Scripting Guys article
' "How Can I Show Users a Dialog Box That Only Lets Them Select Folders?"
' http://www.microsoft.com/technet/scriptcenter/resources/qanda/jun05/hey0617.mspx
'
' Function written by Rob van der Woude
' http://www.robvanderwoude.com
    Const MY_COMPUTER   = &H11&
    Const WINDOW_HANDLE = 0 ' Must ALWAYS be 0

    Dim numOptions, objFolder, objFolderItem
    Dim objPath, objShell, strPath, strPrompt

    ' Set the options for the dialog window
    strPrompt = "Select a folder:"
    If blnSimpleDialog = True Then
        numOptions = 0      ' Simple dialog
    Else
        numOptions = &H10&  ' Additional text field to type folder path
    End If

    ' Create a Windows Shell object
    Set objShell = CreateObject( "Shell.Application" )

    ' If specified, convert "My Computer" to a valid
    ' path for the Windows Shell's BrowseFolder method
    If UCase( myStartLocation ) = "MY COMPUTER" Then
        Set objFolder = objShell.Namespace( MY_COMPUTER )
        Set objFolderItem = objFolder.Self
        strPath = objFolderItem.Path
    Else
        strPath = myStartLocation
    End If

    Set objFolder = objShell.BrowseForFolder( WINDOW_HANDLE, strPrompt, _
                                              numOptions, strPath )

    ' Quit if no folder was selected
    If objFolder Is Nothing Then
        BrowseFolder = ""
        Exit Function
    End If

    ' Retrieve the path of the selected folder
    Set objFolderItem = objFolder.Self
    objPath = objFolderItem.Path

    ' Return the path of the selected folder
    BrowseFolder = objPath
End Function
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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top