Précédent   Forum des professionnels en informatique > Autres langages > Général Visual Basic 6 et VBScript > VBScript
VBScript Le forum d'entraide sur VBScript. Avant de poster -> La FAQ VBScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2012, 18h11   #1
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Par défaut VBS + lancement d'un programme sauf sur certain poste

Bonjour,
Je suis nouveau dans le forum et je viens de débuter avec VBscript. Je souhaiterais réaliser un script de démarrage où à la fin, il lance un programme pour tous les postes sauf sur certains. J'ai actuellement un script en DOS.

@Echo ============= LANCEMENT DU PROG ==========
IF %COMPUTERNAME%==POSTE-X goto endscript
IF %COMPUTERNAME%==POSTE-Y goto endscript
IF %COMPUTERNAME%==POSTE-Z goto endscript

\\serveur\prog\lancement.exe

:endscript

Auriez-vous une idée de ce que cela peut donner en VBS?

Merci par avance
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h24   #2
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 7
Points : 2
Points : 2
En VBS ça donnerai ça :
Code VBS :
1
2
3
4
5
6
7
8
9
 
set WshShell = CreateObject("wscript.Shell")
set WshNetwork = CreateObject("wscript.network")
 
strcomputer = WshNetwork.ComputerName
 
if strcomputer <> "POSTE-X" and strcomputer <> "POSTE-Y" and strcomputer <> "POSTE-Z" then
	WshShell.Run("\\serveur\prog\lancement.exe", , false) 'false pour spécifier de continuer le script sans attendre la fin du programme
end if
Si tu as plus de 3 postes à exclure le IF peut rapidement devenur lourd, il faudrait alors créer un array.
BlobbyBlob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h30   #3
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Tout d'abord merci pour ta réponse. Je souhaiterais effectivement mettre 15 postes. Comment dois je m'y prendre?

Merci
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 20h25   #4
Membre du Club
 
Padawan Informaticien en recherche d'emploi (Bac+3 Administration des Systèmes et des Réseaux)
Inscription : novembre 2006
Messages : 67
Détails du profil
Informations professionnelles :
Activité : Padawan Informaticien en recherche d'emploi (Bac+3 Administration des Systèmes et des Réseaux)

Informations forums :
Inscription : novembre 2006
Messages : 67
Points : 51
Points : 51
Ouais justement c'est le truc auquel je pensais.
L'idée de BlobbyBlob est bien et équivaut à ce que tu avais dans ton fichier de commandes, c'est-à-dire coder en dur dans le if mais imagine la taille du if sur 15 postes et si ça doit evoluer vers 30 ça deviendra une horreur (donc ne parlons même pas de centaines voir de milliers de postes).
Ce qu'il faudrait c'est avoir une partie du code où tu saisie les noms des postes concernés puis que tu parcours ce tableau pour y comparer le nom du poste courant et la liste des postes concernés.

Stocker les noms de machines dans une base de donnée ? (est-ce pertinent ?)
Un dictionary ?
Un tableau ?
Ou même un fichier texte avec un nom de poste par ligne c'est facile à implémenter grace à la méthode ReadLine. Je me demande juste si c'est performant.
Bref, faut trouver un compromis. ^^
Pasokoniidesuka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 20h43   #5
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
est ce que je peux stocker ces postes dans un fichier txt par exemple et faire appel a ce ficher pour ignorer une commande?
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 20h57   #6
Membre du Club
 
Padawan Informaticien en recherche d'emploi (Bac+3 Administration des Systèmes et des Réseaux)
Inscription : novembre 2006
Messages : 67
Détails du profil
Informations professionnelles :
Activité : Padawan Informaticien en recherche d'emploi (Bac+3 Administration des Systèmes et des Réseaux)

Informations forums :
Inscription : novembre 2006
Messages : 67
Points : 51
Points : 51
En fait ce que j'avais en tête c'est un fichier texte avec un nom de poste par ligne. Pour le moment ce que j'ai fait c'est reprendre le script de BlobbyBlob pour te montrer ce que ça donne avec une array de 15 postes. Il faudra juste adapter les noms des postes.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Option Explicit
Dim WshShell, WshNetwork
Dim strComputer
Dim postesExclus(14)
Dim i, shouldDo
 
shouldDo = True
 
postesExclus(0)    = "Janvier"
postesExclus(1)    = "Fevrier"
postesExclus(2)    = "Mars"
postesExclus(3)    = "Avril"
postesExclus(4)    = "Mai"
postesExclus(5)    = "Juin"
postesExclus(6)    = "Juillet"
postesExclus(7)    = "Aout"
postesExclus(8)    = "Septembre"
postesExclus(9)    = "Octobre"
postesExclus(10)    = "Novembre"
postesExclus(11)    = "Decembre"
postesExclus(12)    = "January"
postesExclus(13)    = "February"
postesExclus(14)    = "March"
 
Set WshShell = CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
 
strComputer = WshNetwork.ComputerName
 
For i = 0 To Ubound(postesExclus)
    If LCase(strcomputer) = LCase(postesExclus(i)) Then
        shouldDo = False
        'MsgBox strComputer & " est répertorié comme exclus donc pas d'action"
        Exit For
    End If
Next
 
If shouldDo Then
    'MsgBox strComputer & " est concerné par l'action du script",, i
    WshShell.Run("\\serveur\prog\lancement.exe", , false) 'false pour spécifier de continuer le script sans attendre la fin du programme
End If
Maintenant avec un Fichier ce qu'il faudrait faire c'est recréer un autre objet pour accéder au fichier texte puis lire chaque ligne. Y'aurait quelques lignes en plus mais ça ressemblerait beaucoup.

Ce qui est séduisant avec un fichier texte c'est que c'est éditable très facilement.
Suffit de comprendre qu'il faut écrire un nom de poste par ligne mais je me demande si ça peut poser problème d'accès sur le fichier depuis les postes.

Utiliser un tableau est plus monolithique mais ça marche pas plus mal.
Pasokoniidesuka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 21h16   #7
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Merci de ta réactivité mais surtout pour ce boulot. je test cette manip demain au travail.
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 10h34   #8
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
ça marche très bien.
Merci
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 11h40   #9
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Désolé de relancer cette discussion mais je souhaiterais par le biais du même script refaire une condition de lancement d'une autre application suivant les postes spécifiés comment dois-je m'y prendre?

Lorsque je fais copié/collé ça ne marche pas...

Voila ce que je voudrais faire:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
'-------------------------------------------------------------------------------
'lancement de l'appli 1
'-------------------------------------------------------------------------------
Dim WshNetwork
Dim strComputer
Dim postesExclus(2)
Dim i, shouldDo
shouldDo = True
 
postesExclus(0) = "poste-f"
postesExclus(1) = "poste-g"
postesExclus(2) = "poste-e"
 
 
strComputer = WshNetwork.ComputerName
 
For i = 0 To Ubound(postesExclus)
    If LCase(strcomputer) = LCase(postesExclus(i)) Then
        shouldDo = False
        Exit For
    End If
Next
 
If shouldDo Then
    WshShell.Run "\\monserveur\application1.exe", , false
End If
'-------------------------------------------------------------------------------
'lancement de l'appli 2
'-------------------------------------------------------------------------------
Dim WshNetwork
Dim strComputer
Dim postesExclus(5)
Dim i, shouldDo
shouldDo = True
 
postesExclus(0) = "poste-z"
postesExclus(1) = "poste-t"
postesExclus(2) = "poste-u"
postesExclus(3) = "poste-r"
postesExclus(4) = "poste-a"
postesExclus(5) = "poste-c"
 
 
strComputer = WshNetwork.ComputerName
 
For i = 0 To Ubound(postesExclus)
    If LCase(strcomputer) = LCase(postesExclus(i)) Then
        shouldDo = False
        Exit For
    End If
Next
 
If shouldDo Then
    WshShell.Run "\\monserveur\application2.exe", , false
End If
Merci par avance
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 12h08   #10
Membre confirmé
 
Avatar de pitchalov
 
Homme Manu
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Nom : Homme Manu
Âge : 25
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 265
Points : 265
Bonjour,

Tout d'abord, je pense que tu as oublié de créer tes objets (si le code que tu as posté est complet) :
Code :
1
2
Set WshShell = CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
--> à partir de là, ni la récupération du nom du poste, ni le lancement de l'appli ne peuvent fonctionner.

Ensuite, je te propose une petite fonction qui te permettra de simplifier ton code tout en le rendant plus lisible (à mon sens) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Function StrInArr(strIn, arrIn) 'Teste si la chaine strIn est présente dans arrIn
	Dim strTmp, boolOut
	boolOut = False
	For Each strTmp In arrIn
		If StrComp(strTmp, strIn, vbTextCompare) = 0 Then boolOut = True
	Next
	StrInArr = boolOut
End Function
 
Dim WshNetwork, WshShell
Dim strComputer
Dim postesExclus
 
Set WshShell = CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
strComputer = WshNetwork.ComputerName
 
'-------------------------------------------------------------------------------
'lancement de l'appli 1
'-------------------------------------------------------------------------------
postesExclus = Array("poste-f", "poste-g", "poste-e") ' liste des postes pour lesquels l'appli n'est pas lancée
If NOT StrInArr(strComputer, postesExclus) Then WshShell.Run "\\monserveur\application1.exe", , false ' si le nom du pc n'est pas dans le tableau, lancement de l'appli
 
'-------------------------------------------------------------------------------
'lancement de l'appli 2 --> même procédé
'-------------------------------------------------------------------------------
postesExclus = Array("poste-z", "poste-t", "poste-u", "poste-r", "poste-a", "poste-c")
If NOT StrInArr(strComputer, postesExclus) Then WshShell.Run "\\monserveur\application2.exe", , false
Enfin, voici quelques pistes pour mettre tes noms de postes à exclure dans un fichier texte :
- Ouverture du fichier texte (méthode OpenTextFile de l'objet FSO)
- Lecture ligne par ligne du fichier (Méthode ReadLine de l'objet File)
- Pour chaque ligne lue, on incrémente le tableau des postes à exclure (voir Redim Preserve pour le redimmensionnement du tableau)

Bonne continuation.
pitchalov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 13h25   #11
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Géniale!! ça marche!!
Merci de ton aide pitchalov!
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2012, 10h11   #12
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Je me suis permis de relancer ce sujet car j'aimerais modifier le script de façon à faire appel a un fichier TXT comme proposé par pitchalov. En effet, j'ai de plus en plus de postes et j'aimerais plus faire appel à ce fichier.

Pourriez-vous m'aider?

Merci
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2012, 15h08   #13
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Personne pour m'aider?
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2012, 15h51   #14
Membre confirmé
 
Avatar de pitchalov
 
Homme Manu
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Nom : Homme Manu
Âge : 25
Localisation : France

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 265
Points : 265
Bonjour,

Voici le principe pour obtenir ton tableau de postes à exclure depuis un fichier texte :
1 - Lecture du fichier (mode ligne à ligne) : FAQ VBS - Comment lire le contenu d'un fichier texte ?
2 - Pour chaque ligne du fichier, alimentation du tableau d'exclusion : Voir Redim Preserve dans la doc VBS.
3 - Utilisation du tableau dans le script déjà à ta disposition.

Montre-nous ton code afin qu'on t'apporte de l'aide si tu en as besoin.
Bonne continuation.
pitchalov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2012, 18h37   #15
Membre émérite
 
Avatar de cubitus91
 
Homme
Consultant informatique
Inscription : mai 2004
Messages : 725
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2004
Messages : 725
Points : 899
Points : 899
Citation:
Envoyé par genius2139 Voir le message
Personne pour m'aider?
Hello malgrés que pitchalov t'es donné des infos pour la réalisation de ton script. Je me suis permi de t'avancer un peu sur le sujet. Par contre, j'utilise un fichier xml. pour une relation PC/Program.
J'ai fait ca rapidement, mais je pense que cela te fera une base.Voici ton fichier de reference xml :
Code xml :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8" ?>
<programcomputer>
  <programs>
    <program id="1">
      <name>Program 1</name>
      <path>c:\Program1</path>
      <executable>program1.exe</executable>
    </program>
    <program id="2">
      <name>Program 2</name>
      <path>c:\Program2</path>
      <executable>program2.exe</executable>
    </program>
  </programs>
  <Computers>
    <computer>
      <name>PC1</name>
      <programid>1</programid>
    </computer>
    <computer>
      <name>PC2</name>
      <programid>2</programid>
    </computer>
  </Computers>
</programcomputer>
et le fichier vbs associé :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Option Explicit
'Constantes
Const XmlFileName = "ComputerProgram.xml"
Private Sub Main()
'local Var
Dim strComputer,computer,Program
strComputer = GetComputername
If CheckFileExist Then 
 For Each computer In  QuerryXml("/programcomputer/Computers/computer[name='" & strComputer & "']/programid")
  WScript.Echo computer.text
  For Each Program In  QuerryXml("/programcomputer/programs/program[@id='" & computer.text & "']")
  WScript.Echo "L'ordinateur doit lancer ce programe:" & Program.selectSingleNode("name").text
  WScript.Echo "Le path de l'executable est le suivant: " & Program.selectSingleNode("path").text
  WScript.Echo "Le nom de l'executable est le suivant: " & Program.selectSingleNode("executable").text
  WScript.Echo "Donc on a: " & Program.selectSingleNode("path").text & "\" & Program.selectSingleNode("executable").text
 
  Next 
 Next
End If 
End Sub 
 
 
Private Function QuerryXml(pstrQuery)
'local var
Dim ObjXMLDoc
Set ObjXMLDoc = CreateObject("Microsoft.XMLDOM")
ObjXMLDoc.Async = "false"
ObjXMLDoc.Load(XmlFileName)
Set QuerryXml = ObjXMLDoc.selectNodes(pstrQuery)
Set ObjXMLDoc = Nothing
End Function 
 
Private Function GetComputername()
'local var
Dim ObjShell
'Construct object
Set ObjShell = WScript.CreateObject( "WScript.Shell" )
GetComputername = ObjShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )
'Destruct Object
Set ObjShell = Nothing
End Function 
Private Function GetScriptDirectory()
'local var
Dim ObjShell
Set ObjShell = CreateObject("WScript.shell") 
GetScriptDirectory = ObjShell.CurrentDirectory 
Set ObjShell = Nothing
End Function 
Private Function CheckFileExist()
'local var
Dim ObjFileSystemObject
Set ObjFileSystemObject = CreateObject("Scripting.FileSystemObject")
CheckFileExist = ObjFileSystemObject.FileExists(GetScriptDirectory & "\" & XmlFileName)
Set ObjFileSystemObject = Nothing
End Function
Comme le but n'est pas forcement que l'on fasse vos scripts, je te laisse le comprendre, mais n'hésite pas à revenir vers les membres du forum pour de plus amples informations.
Cordialement
__________________
Le tag est bien utile, alors pensez y !
cubitus91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2012, 09h42   #16
Invité régulier
 
Homme
Technicien maintenance
Inscription : janvier 2012
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Technicien maintenance
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : janvier 2012
Messages : 69
Points : 5
Points : 5
Tout d'abord merci pour ta solution cubitus91.
Dès que possible, j'essaierai ta solution pour te dire si cela fonctionne.
genius2139 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h24.


 
 
 
 
Partenaires

Hébergement Web