> Tous les forums > Forum Autres langages
 VBS, problème de syntaxe
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
fgondard
  Posté le 08/06/2018 @ 11:25 
Aller en bas de la page 
Grand Maître astucien

Bonjour,

Je viens de trouver ce script sur la toile :

filePath = BrowseForFile()

If filePath = "" Then
MsgBox "Operation canceled", vbcritical
Else
MsgBox filePath, vbinformation
End If

'--------------------------------------------------------------------------------------
Function BrowseForFile()
'@description: Browse for file dialog.
'@author: Jeremy England (SimplyCoded)
BrowseForFile = CreateObject("WScript.Shell").Exec("mshta.exe ""about:<input type=file id=f>" & _
"<script>resizeTo(0,0);f.click();new ActiveXObject('Scripting.FileSystemObject')" & _
".GetStandardStream(1).WriteLine(f.value);close();</script>""" _
).StdOut.ReadLine()
End Function

La fonction permet d'afficher la fenêtre standard de séléction d'un fichier et renvoie le nom complet de celui sélectionné. Le début du script n'est là que pour illustrer le fonctionnement.

Ça fonctionne parfaitement mais l'écriture est particulièrement condensée et j'ai souhaité l'aérer pour mieux comprendre le mécanisme.

J'ai donc cru obtenir le même résultat avec ça :

filePath = BrowseForFile()
If filePath = "" Then
MsgBox "Operation canceled", vbcritical
Else
MsgBox filePath, vbinformation
End If
'--------------------------------------------------------------------------------------
Function BrowseForFile()
htafic = "about:<input type=file id=f><script>resizeTo(0,0);f.click();new ActiveXobject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(f.value);close()</script>"
MsgBox htafic
Set MonShell = CreateObject("WScript.Shell")
BrowseForFile = MonShell.Exec("mshta.exe ""htafic""").StdOut.ReadLine()
End Function

Et ... rien ne se passe !

Ce que j'ai cru comprendre sur le fonctionement de la fonction : on lance mshta en lui passant en paramètre une chaîne de caractères sensée repésenter le contenu d'un fichier hta à l'intérieur duquel on exécute un script VBS.

Je n'ai rien trouvé à propos de "about:" mais je suppose que c'est une commande HTML qui permet d'établir un comportement général pour tout ce qui suit et que les indications qu'elle contient auraient tout aussi bien pu être mises dans la balise <script>

Dans le script ;
- on commence par réduire à rien la taille de la fenêtre ;
- on simule un click ;
- on instancie un objet ActiveX et le nom du fichier sélectionné (f.value) est écrit dans la sortie standard ;
- on clos quelque chose, la fenêtre ouverte par mshta je suppose.

La fonction prend la valeur lue dans la sortie standard.

Je n'ai rien trouvé non plus sur le ";" qui apparaît dans le texte du script. Je suppose qu'il sert de séparateur. Il est peut-être possible de jouer avec des VBCrLf à la place de manière à donner au script une allure plus habituelle.

Le Msgbox dans la fonction est de mon cru est n'est là que pour la mise au point.

Il y a sûrement des tas de trucs qui m'échappent et j'aurai bien besoin de vos lumières.

Merci d'avance.



Modifié par fgondard le 08/06/2018 11:26
Publicité
zoulouman
 Posté le 09/06/2018 à 04:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Salut,

Désolé, je ne connais pas VBS et ne veux surtout pas utiliser ce langage. Ca fait partie du pire en matière de sécurité chez Microsoft.

Par contre, je peux éclairer ta lanterne sur le point virgule ( ; ).
Dans un langage "normal", le ; met fin à une ligne d'instructions/fonctions.
Selon les langages, il doit être suivi d'un saut de ligne ou peut supporter d'autres instructions/fonctions à la suite.

La bonne pratique veut qu'on passe à la ligne après un ; pour des histoires de lisibilité du code.

Désolé de ne pas pouvoir t'aider plus.

fgondard
 Posté le 09/06/2018 à 14:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Grand Maître astucien

Par contre, je peux éclairer ta lanterne sur le point virgule ( ; ).
Dans un langage "normal", le ; met fin à une ligne d'instructions/fonctions.

Merci pour cette précision.

C'est bien ce que j'avais supposé mais je n'ai rien trouvé dans le cas particulier de vbs.

Là on est dans un cas particulier puisque c'est une chaîne de caractères qui doit être vue comme le contenu d'un fichier. D'où la syntaxe peu conventionnelle.

J'ai posé la même question sur un forum plus spécialisé et je ne manquerai pas de rapporter ici le résultat de ma demande.

fgondard
 Posté le 09/06/2018 à 16:37 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Grand Maître astucien

J'avais tout simplement oublié qu'il fallait que je concatène la chaîne représentant le pseudo fichier HTA à la suite du exec. Vite trouvé par un intervenant sur developpez.com. Il restait cependant encore des problèmes de guillemets.

Finalement ma tentative de rendre la chose moins absconse donne ça :

'-------------------------------------
'Récupération nom complet d'un fichier
'-------------------------------------

filePath = BrowseForFile()
If filePath = "" Then
MsgBox "Operation canceled", vbcritical
Else
MsgBox filePath, vbinformation
End If

'---------------------
'Fonction récupération
'---------------------

Function BrowseForFile()

'--------------------
' Pseudo fichier HTA
'--------------------
htafic = """about:<input type=file id=f>" & _
"<script>" & _
"resizeTo(0,0);" & _
"f.click();" & _
"new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(f.value);" & _
"close()" & _
"</script>"""
'----------------------
' Création objet shell
'----------------------
Set MonShell = CreateObject("WScript.Shell")
'-----------
' Exécution
'-----------
BrowseForFile = MonShell.Exec("mshta.exe " & htafic).StdOut.ReadLine()

End Function

C'est un plus lisible mais ça reste encore un peu mystérieux pour moi. Ma variable htafic a presque l'air d'un fichier. Mais je n'ai jamais travaillé avec des fichiers HTA ni utilisé de contrôles activeX. Il va falloir que je pioche un peu.

Au passage j'ai tenté de remplacer les ";" par des vbcrlf mais ça ne marche pas.

Merci encore pour ton intervention.



Modifié par fgondard le 09/06/2018 16:52
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
84,00 €Disque dur externe portable Toshiba Canvio Basics 4 To USB 3.0 à 84 €
Valable jusqu'au 23 Juin

Amazon propose actuellement le disque dur externe portable Toshiba Canvio Basics 4 To USB 3.0 à 84 € seulement ! Avec ses 4 To et sa connectique USB 3.0 compatible USB 2.0, vous aurez de quoi stocker rapidement et emporter avec vous vos photos, vos films, etc.  La livraison est gratuite.


> Voir l'offre
13,99 €Clé USB Sandisk Ultra 64 Go à double connectique USB 3.1 Type A et C à 13,99 €
Valable jusqu'au 23 Juin

Amazon fait une promotion sur la clé USB Sandisk Ultra 64 Go à double connectique USB 3.1 Type A et C qui passe à 13,99 € alors qu'on la trouve ailleurs à plus de 25 €. Cette clé USB  dispose d'un connecteur réversible USB Type C et d'un connecteur classique de type A. Grâce à elle, transférez en toute simplicité et rapidement (jusqu'à 150 Mo/s) vos fichiers entre vos smartphones, tablettes et ordinateurs. 


> Voir l'offre
66 €Onduleur Eaton 3S 550 FR à 66 €
Valable jusqu'au 24 Juin

Amazon fait une promotion sur l'onduleur Eaton 3S 550 FR qui passe à 66 € livré gratuitement alors qu'on le trouve ailleurs autour de 80 €. Cet onduleur de 550VA/ 330 Watts offre 3 prises protégées et ondulées et 3 prises protégées. La batterie est remplaçable et offre une autonomie de 8 minutes. Son port USB et le logiciel d'arrêt fourni permet d'enregistrer automatiquement vos données et fermer vos applications avant que vos batteries ne soient épuisées.


> Voir l'offre

Sujets relatifs
Problème avec affichage dans excel VBA
Problème d'installation sur Visual Studio
Problème avec WinPython - Spyder
syntaxe zone de liste déroulante dans excel 2010
C Problème pointeur et passage en référence.
problème macro excel
Problème avec les espaces C++
Problème pour un batch urgent, veuillez lire svp
problème avec un parametre de requete preparée MVC
Problème de gestion dynamique de JCheckbox
Plus de sujets relatifs à VBS, problème de syntaxe
 > Tous les forums > Forum Autres langages