Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[VBS] Doubles guillemets et espaces: oui, mais dans quels cas ?

900 views
Skip to first unread message

sympatix

unread,
May 24, 2004, 10:22:07 AM5/24/04
to
Bonjour !

J'ai encore du mal avec les doubles Guillemets !

Je pensais avoir compris, qu'il faut doubler les guillemets autour d'une
chaine qui comporte des espaces.

Donc, normalement, il faut écrire:

---------------------------------
Set oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.MoveFile """C:\toto 1.txt""" , """C:\toto 2.txt"""' =>ça ne
' Fonctionne pas
---------------------------------

On est bien d'accord, j'ai bien doublé les guillemets autour de chaque
chaine qui comporte des espaces...
Eh bien, ça ne fonctionne pas ! Par contre, sans doubler les guillemets,
nickel:

---------------------------------
Set oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.MoveFile "C:\toto 1.txt" , "C:\toto 2.txt" ' =>ça Fonctionne, et
' pourtant, il y a des espaces
---------------------------------

Maintenant, si je fais appel à Run de l'objet Shell, il *faut*
effectivement dans ce cas doubler les guillemets, en cas d'espace,
sinon, ça ne fonctionne pas:

---------------------------------
Set oShell = CreateObject("WScript.Shell")
oShell.Run """C:\toto 2.txt"""' =>ça Fonctionne
---------------------------------

Ma question est simple: Dans quels cas faut-il doubler les guillemets
quand un chemin de fichier, compris dans une chaine, comporte des
espaces ?

Merci d'avance :-)


Cordialement
Sympatix

Attention, totosy...@tototele2.fr est mon adresse antispam non
valide.
Pour me répondre, tous-les-toto-sont-en-trop, merci

...Une 2ème chance, pour ceux qui n'ont pas compris;-)
saint_path_x_arobaz_t'es_laide_euh_point_fr

Stephane D

unread,
May 24, 2004, 10:31:13 AM5/24/04
to
> Ma question est simple: Dans quels cas faut-il doubler les guillemets
> quand un chemin de fichier, compris dans une chaine, comporte des
> espaces ?

Tu prens pas le problème comme il faut, le doublage des guillemets c'est
selon la nécéssité de la fonction utilisée:
Exemple avec wscript.echo
Pour afficher une chaine Hello world !!! tu mets:
wscript.echo "Hello World !!!"
Pour afficher Hello "World" !!! tu mets
wscript.echo "Hello ""World"" !!!"
Pour afficher Hello "World" "!!!" tu mets
wscript.echo "Hello ""World"" ""!!!"""
Pour afficher Hello "World" "!!!" tu peux mettre aussi
wscript.echo "Hello " & """World """ & """!!!"""

Le premier guillemet indique que c'est une chaine de caractères qui
commencent. Si je doublais pas le second guillemet ce serait la fin de
la chaine de caractère pour wscript.echo. Alors que le doublage de
guillemet indique à wscript.echo qu'il doit afficher le guillemet. Idem
pour le troisième cas.
Dans ton premier cas ta commande ne réclame pas de guillemets alors que
l'autre commande si.


J'espère que ca va t'aider à comprendre le binz.

@+ Stephane

sympatix

unread,
May 24, 2004, 10:43:54 AM5/24/04
to
Salut !

> Dans ton premier cas ta commande ne réclame pas de guillemets alors
que
> l'autre commande si.

Mais pourquoi, justement...
La seule différence entre le 1er et le 2e cas, c'est que dans le 1er,
c'est l'objet FSO qui est utilisé, dans le second, l'objet Shell.
ça voudrais dire (je le comprend comme ça, en tout cas), que l'objet
Shell réclame un doublage de guillemets en cas d'espaces, et pas l'objet
FSO ?


Cordialement
Sympatix

Attention, totosy...@tototele2.fr est mon adresse antispam non
valide.
Pour me répondre, tous-les-toto-sont-en-trop, merci

...Une 2ème chance, pour ceux qui n'ont pas compris;-)
saint_path_x_arobaz_t'es_laide_euh_point_fr

"Stephane D" <sur...@forum.fr> a écrit dans le message de
news:c8t0vd$d11$1...@s1.read.news.oleane.net...

Vuillermet Jacques

unread,
May 24, 2004, 10:46:52 AM5/24/04
to

Dans :

oFSO.MoveFile """C:\toto 1.txt""" , """C:\toto 2.txt"""

on tente de déplacer le fichier dont le nom est :
"C:\toto 1.txt"
(les guillemets appartenant au nom du fichier, donc seraient visibles dans
l'Explorateur)

Or, je pense que tu souhaites copier le fichier :
C:\toto 1.txt

donc tu dois écrire :


oFSO.MoveFile "C:\toto 1.txt" , "C:\toto 2.txt"

Dans :
oShell.Run """C:\toto 2.txt"""
la chose est différente.
En effet, la méthode .Run ne prend pas le paramètre tel quel pour action,
mais se "contente" de le transmettre à une session DOS.
Or, en DOS, l'espace en un séparateur d'arguments.
Sous DOS, pour que l'espace soit considéré comme un caractère du chemin et
non comme un séparateur le délimiteur " a été introduit.
Puisqu'il faut transmettre le caractère " il faut le spécifier dans le code
VB.
Mais pas d'bol, ce caractère est le délimiteur de chaînes de caractères en
VB. Donc, comme dans quasi-tout langage, on le double pour, en fait, ne
l'insérer qu'une seule fois dans la chaîne de caractères.
DOS verra donc arriver :
"C:\toto 2.txt"
Ce qu'il comprend très bien.

Ouf !

Jacques.


"sympatix" <totosy...@tototele2.fr> a écrit dans le message de news:
u3JAqnZQ...@TK2MSFTNGP12.phx.gbl...

sympatix

unread,
May 24, 2004, 11:07:31 AM5/24/04
to
Salut !

J'ai lu avec attention tes explications, et j'ai bien compris la raison
du doublage des guillemets. Mais comment savoir à l'avance, si le code
qu'on va écrire, passera par le DOS, ou pas, et s'il faut donc, le cas
échaéant, doubler les guillemets, ou pas ?
Pour l'instant, je viens de dévouvrir que FSO ne supporte pas le
doublage, alors que Wsh, de par sa manière de fonctionner, nous
contraint à les doubler en cas d'espace.

Mon raisonnement est-il juste, ou ai-je tout faux ?
:-)

Cordialement
Sympatix

Attention, totosy...@tototele2.fr est mon adresse antispam non
valide.
Pour me répondre, tous-les-toto-sont-en-trop, merci

...Une 2ème chance, pour ceux qui n'ont pas compris;-)
saint_path_x_arobaz_t'es_laide_euh_point_fr

"Vuillermet Jacques" <jvuil...@no-spam.fr> a écrit dans le message de
news:OdyJ92ZQ...@tk2msftngp13.phx.gbl...

Jean

unread,
May 24, 2004, 11:17:13 AM5/24/04
to
Bonjour,

Oui, c'est bien ça pour FSO, les noms avec espaces sont "gérés" en interne dans ses méthodes.
Ce n'est sans doute pas pour rien qu'il s'appelle "Objet Système de Fichier" :-) :-)

Sinon pour votre référence à l'objet Shell (WScript.Shell), c'est plus large.
Les doubles guillemets pour des chemins avec espaces sont nécessaires dans tout Windows Scripting Host (WSH) pour les méthodes,
propriétés, ... qui en ont besoin.
La méthode Run de WScript.Shell par exemple n'est rien d'autre que la commande Démarrer-Exécuter portée à l'automation ... ce qui
est vrai pour l'un est vrai pour l'autre.
Il en va de même avec les objets WshArguments, WshShortcut, etc ...

De façon plus générale encore, vous pouvez considérer qu'à de rares exceptions près (dans des composants tiers généralement) ,
*seul* FSO gère les chemins avec espaces "en interne" ... les fichiers, c'est son job ;-)
Tout autre fonction, méthode ou propriété d'un objet nécessitant des chemins (ou éléments : cf WshShortcut) avec espaces nécessitera
le doublage de guillemets (ou
plutôt de les mettre "à la main" ).

wscript.echo """"&"chemin"&""""
wscript.echo """chemin"""

On aurait aussi pu, par exemple utiliser Chr(34) pour les indiquer.

wscript.echo Chr(34)&"chemin"&Chr(34)

Ceci dit dans un contexte VbScript bien sûr.

Amicalement,

Jean - JMST
Belgium

"sympatix" <totosy...@tototele2.fr> a écrit dans le message de news:OIp30zZQ...@TK2MSFTNGP12.phx.gbl...

Vuillermet Jacques

unread,
May 24, 2004, 11:24:05 AM5/24/04
to

Ton raisonnement a la confusion de quelqu'un qui découvre... mais qui
comprend.

>Mais comment savoir à l'avance, si le code
> qu'on va écrire, passera par le DOS, ou pas, et s'il faut donc, le cas
> échaéant, doubler les guillemets, ou pas ?

A part .Run je ne vois pas d'autres méthodes, donc pas d'inquiétude : tu es
tombé sur le cas particulier.
Pour "savoir", il faut lire les docs & articles.

> Pour l'instant, je viens de dévouvrir que FSO ne supporte pas le
> doublage

L'utilisation du doublage n'a rien de particulier avec FSO, c'est celle de
VB/VBScript pour tout ce qui est manipulation de chaîne de caractères.

> alors que Wsh, de par sa manière de fonctionner, nous
> contraint à les doubler en cas d'espace.

Non, pas Wsh, mais la méthode Run de l'objet WshShell (Wscript.Shell)
seulement.

En résumé, le doublage à utiliser avec Run ce n'est pas du VBScript c'est du
DOS.
C'est une encapsulation de language, comme quand, dans le script d'une page
ASP on construit dynamiquement du HTML (ou du JavaScript, ...) qui sera
interprété ensuite par le navigateur.
Encore dit autrement, ce que génère un language est un autre language.
Ici, on construit dynamiquement un language qui sera compréhensible par le
DOS.

[Pour la petite histoire, tant que les 2 languages encapsulés sont
différents tout va bien, mais cela peut commencer à devenir difficile quand
ils sont identiques : par exemple, dans une page ASP construire en VBScript
un Script VBScript qui sera exécuté par le navigateur].

Jacques.


"sympatix" <totosy...@tototele2.fr> a écrit dans le message de news:

#r3vBBaQ...@TK2MSFTNGP12.phx.gbl...

Jean

unread,
May 24, 2004, 11:27:56 AM5/24/04
to
Bonjour,

> Mais comment savoir à l'avance, si le code
> qu'on va écrire, passera par le DOS, ou pas, et

---

Le problème n'est pas de passer "sous DOS" ou pas, mais de traiter un chemin (une chaîne) contenant des espaces dans Windowset
devant être interprétée *en un seul bloc*.
Comme dit plus haut : si pas FSO -> on "double les guillemets" dans ce cas.


Amicalement,

Jean - JMST
Belgium

"sympatix" <totosy...@tototele2.fr> a écrit dans le message de news:%23r3vBBa...@TK2MSFTNGP12.phx.gbl...

Vuillermet Jacques

unread,
May 24, 2004, 11:45:51 AM5/24/04
to

>si pas FSO -> on "double les guillemets" dans ce cas

Il me semble que ta règle n'est pas juste, voici 2 contre-exemples :
* CreateShortCut de Wscript.Shell.
* MapNetworkDrive de Wscript.Network.

FSO est un objet comme un autre, il n'y a aucune raison qu'il y ait des
particularités syntaxiques de VBScript spécifiques à cet objet.
C'est l'interpréteur de commande du DOS qui exige le doublage dont on parle.

Jacques.


"Jean" <http://cour...@jmst.be.tf> a écrit dans le message de news:
#RwA$OaQEH...@tk2msftngp13.phx.gbl...

sympatix

unread,
May 24, 2004, 12:12:21 PM5/24/04
to
>Ton raisonnement a la confusion de quelqu'un qui découvre... mais qui
>comprend.
Qui comprend qu'il découvre ;-)

> A part .Run je ne vois pas d'autres méthodes, donc pas d'inquiétude :
tu es
> tombé sur le cas particulier.

Bon, c'est bien de le savoir:-)

> C'est une encapsulation de language, comme quand, dans le script d'une
page
> ASP on construit dynamiquement du HTML (ou du JavaScript, ...) qui
sera
> interprété ensuite par le navigateur.

Passionnant...même si je suis un peu largé, là !

Merci pour ta vulgarisation Vbscriptienne, j'y vois quand même un peu
plus clair...mais ne brulons pas les étapes :-)


Cordialement
Sympatix

Attention, totosy...@tototele2.fr est mon adresse antispam non
valide.
Pour me répondre, tous-les-toto-sont-en-trop, merci

...Une 2ème chance, pour ceux qui n'ont pas compris;-)
saint_path_x_arobaz_t'es_laide_euh_point_fr
"Vuillermet Jacques" <jvuil...@no-spam.fr> a écrit dans le message de

news:uRzKwLaQ...@tk2msftngp13.phx.gbl...

sympatix

unread,
May 24, 2004, 1:13:04 PM5/24/04
to
Bonjour !

>*seul* FSO gère les chemins avec espaces "en interne" ... les fichiers,
>c'est son job ;-)

Là, je comprend un peu mieux, effectivement...

>wscript.echo """"&"chemin"&""""
Sauf que là, selon la logique de lecture, je comprend différement:
(par souci de clarté, je met ce que je cite entre [ ] )

*1er point de vue*
1: A gauche [""""], peut être compris comme deux guillemets, entre
guillemets (donc, un double guillemet, servi entre pincettes)
2: Ensuite, on concatène avec ["Chemin"]
3: Enfin, on referme nos premières doubles guillemets
==> Là, ça se tient...

*2eme point de vue*
1: A gauche, [""] Doublage => Comment l'interprêter ?
2: Ensuite, [""] redoublage => Pareil ?
...Etc...

Bref, je ne sais pas si c'est moi qui ai l'esprit tordu, mais j'essaye
de me mettre à la place du moteur de script, pour savoir comment il
interprête le code:

De gauche à droite, caratère par caractère, ou un peu plus
"intelligement" en regroupant certains caratères qui lui semble former
une
instruction interressante ?

Merci !

Cordialement
Sympatix

Attention, totosy...@tototele2.fr est mon adresse antispam non
valide.
Pour me répondre, tous-les-toto-sont-en-trop, merci

...Une 2ème chance, pour ceux qui n'ont pas compris;-)
saint_path_x_arobaz_t'es_laide_euh_point_fr

"Jean" <http://cour...@jmst.be.tf> a écrit dans le message de
news:%23QQJ%23IaQE...@TK2MSFTNGP10.phx.gbl...

Jean

unread,
May 24, 2004, 1:09:29 PM5/24/04
to
Bonjour,

"Vuillermet Jacques" <jvuil...@no-spam.fr> a écrit dans le message de news:ezjv6XaQ...@TK2MSFTNGP11.phx.gbl...


>
> >si pas FSO -> on "double les guillemets" dans ce cas
>
> Il me semble que ta règle n'est pas juste, voici 2 contre-exemples :
> * CreateShortCut de Wscript.Shell.
> * MapNetworkDrive de Wscript.Network.
>

Oui, ça fait partie des "exceptions" hors FSO dont je parlais (vous n'en trouverez pas beaucoup).
Pour le reste je ne suis pas vraiment d'accord avec vous ... mais vous avez peut être raison :O)

Jean

unread,
May 24, 2004, 1:25:36 PM5/24/04
to
Bonjour,

C'est simple :
1- en VBScript une chaîne est déclarée en l'entourant de guillemets ... OK ? :O)
donc chaine="MOT"
2- en VBScript, 2 guillemets représente 1 guillemet.
Donc si je veux entourer MOT de guillemets pour que VBScript "lise" : "MOT" :
(je rajoute des espaces pour la clarté)

chaine=" "" MOT "" "

-les guillemets 1 et 6 sont ceux qui servent à la déclaration d'une chaîne en VBScript
-les guillemets 2et 3 représente (sont interprétés comm) un caractère guillemets en VBScript
-les guillemets 4 et 5 représente un caractère guillemets en VBScript

... donc ...on compresse :

chaine="""MOT"""
-> VBScript "lit" : "MOT"

Amicalement,

Jean - JMST
Belgium

"sympatix" <totosy...@tototele2.fr> a écrit dans le message de news:eAcQLHbQ...@tk2msftngp13.phx.gbl...

sympatix

unread,
May 24, 2004, 2:55:44 PM5/24/04
to
> C'est simple :
Avec vous, *tout* est simple ;+))
>.../...

> ... donc ...on compresse :
>
> chaine="""MOT"""
> -> VBScript "lit" : "MOT"

Oui, effectivement, dans cet exemple simple, c'est simple...et
logique...
Vous allez me dire: la logique reste exactement la même, que l'on aie 1,
10, ou 20 mots, et 1 , 10, ou 20 variables !
La logique, oui, mais pas la simplicité !
C'est pour ça, que je me disait qu'en connaissant la façon de travailler
du moteur de script, on pourrait, en "pensant" comme lui construire et
déboguer un script, de façon identique, quelque soit sa complexité,
qu'li fasse 2, ou 2000 lignes, puisque la logique reste la même.

Mais peut-être que je veux réinventer le fil à couper le beurre, et
qu'un tel outil existe ?

En attendant, merci pour vos réponses, comme toujours, rapides, et
précises :-)

Cordialement
Sympatix

Attention, totosy...@tototele2.fr est mon adresse antispam non
valide.
Pour me répondre, tous-les-toto-sont-en-trop, merci

...Une 2ème chance, pour ceux qui n'ont pas compris;-)
saint_path_x_arobaz_t'es_laide_euh_point_fr
"Jean" <http://cour...@jmst.be.tf> a écrit dans le message de

news:Oyp6eQb...@TK2MSFTNGP11.phx.gbl...

Jean

unread,
May 24, 2004, 3:47:38 PM5/24/04
to
Bonjour,

Pour une fois (mais c'est bon pour une fois :O) , je vous inviterais à réinventer la roue ... le meilleur exercice qui puisse être
dans le cas présent.

Sinon, pourquoi ne pas, comme on dit chez nous, une fois, "prévenir plutôt que guérir" ... en créant une fonction ... testée et
approuvée par les meilleures marques :O) :

'---8<---Entre_Guillemets.VBS---8<---
'*DEMO
repertoire="c:\program files\"
applirep="internet explorer\"
appliexe="iexplore.exe"
WScript.Echo Entre_Guillemets(repertoire&applirep&appliexe)
CreateObject("WScript.Shell").Run(Entre_Guillemets(repertoire&applirep&appliexe))
'DEMO*

Function Entre_Guillemets(chaine)
Entre_Guillemets=""""&chaine&""""
End Function
'---8<---Entre_Guillemets.VBS---8<---

Je parle de ce que je ne connais pas ... mais j'ai peut être raison :O)

Amicalement,

Jean - JMST
Belgium

"sympatix" <totosy...@tototele2.fr> a écrit dans le message de news:ulhCjAcQ...@TK2MSFTNGP12.phx.gbl...

sympatix

unread,
May 24, 2004, 4:37:12 PM5/24/04
to
> Pour une fois (mais c'est bon pour une fois :O) , je vous inviterais
à réinventer la roue ... le meilleur exercice qui puisse être
> dans le cas présent.
Bon, ben...j'commence tout de suite, vu que y a pas mal de boulot (qu'on
me monte une bière et des sandwichs) ;+))

> Sinon, pourquoi ne pas, comme on dit chez nous, une fois, "prévenir
plutôt que guérir" ... en créant une fonction ... testée et
> approuvée par les meilleures marques :O) :

Oui...


> Je parle de ce que je ne connais pas ... mais j'ai peut être raison
:O)

Euh...j'avoue que, sans vouloir vous froisser, l'utililité de votre
fonction ne m'a pas sauté aux yeux...du premier coup...mais après
plusieurs lancements, et quelques "arrangements", j'ai vu naitre en moi
(gràce à la fonction) de nouvelle idées (dans le cadre du réinvantage de
la roue...), pour construire d'autres fonctions d'aide à l'écriture de
scripts, etc...
;-)
Donc, merci :-)

Cordialement
Sympatix

Attention, totosy...@tototele2.fr est mon adresse antispam non
valide.
Pour me répondre, tous-les-toto-sont-en-trop, merci

...Une 2ème chance, pour ceux qui n'ont pas compris;-)
saint_path_x_arobaz_t'es_laide_euh_point_fr
"Jean" <http://cour...@jmst.be.tf> a écrit dans le message de

news:%23$dPOgcQE...@TK2MSFTNGP10.phx.gbl...

0 new messages