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 06/12/2011, 12h27   #1
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Par défaut Erreur "Chemin d'accès introuvable"

Bonjour,

J'ai un souci incompréhensible ...
Mon script test l'existence d'un répertoire et le supprime.
Pourtant j'arrive à avoir une erreur lors de la tentative de suppression :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
StrComputer = wscript.arguments(0)
 
RepName = "\\" & StrComputer & "\c$\Documents and Settings\"
 
		For i = 1 TO 99999
 
			if i > 0 and i < 10 then RepPath = RepName & "a0000" & i
			if i > 9 and i < 100 then RepPath = RepName & "a000" & i
			if i > 99 and i < 1000 then RepPath = RepName & "a00" & i
			if i > 999 and i < 10000 then RepPath = RepName & "a0" & i
			if i > 9999 and i < 100000 then RepPath = RepName & "a" & i
 
		If oFSO.FolderExists(RepPath) = True Then oFSO.DeleteFolder RepPath, True
		Next
Citation:
Ligne : 15
Caract. : 45
Erreur : chemin d'accès introuvable
Code : 800A004C
Je n'arrive pas à comprendre l'origine du souci ... LCase, Ucase, format de ma variable RepName ... ???
Comment ce répertoire peut-il exister et ne pas exister ?

Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 12h59   #2
Rédacteur/Modérateur
 
Avatar de ProgElecT
 
Homme Francis MILLET
Inscription : décembre 2004
Messages : 2 934
Détails du profil
Informations personnelles :
Nom : Homme Francis MILLET
Âge : 56
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Secteur : Communication - Médias

Informations forums :
Inscription : décembre 2004
Messages : 2 934
Points : 4 147
Points : 4 147
Envoyer un message via MSN à ProgElecT
Salut
Code :
		If oFSO.FolderExists(RepPath) = True Then oFSO.DeleteFolder(RepPath), True
Il me semble bien que les parenthèses soient nécessaires
ProgElecT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 14h09   #3
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Salut ProgElecT !

C'était une bonne idée, mais non, désolé, j'obtiens la même erreur ...
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 14h28   #4
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
Salut,

Tout d'abord, ta boucle serait plus simple comme cela (sans les 4 tests) :
Code :
1
2
3
4
5
For i = 1 TO 99999
 
	RepPath = RepName & "a" & Right("0000" & i, 5)
	If oFSO.FolderExists(RepPath) Then oFSO.DeleteFolder RepPath, True
Next
Sinon, le message d'erreur est effectivement bizarre, vu que tu testes l'existence du répertoire avant la suppression.

As-tu essayé en mettant des guillemets autour de ta chaine?
Code :
RepPath = """" & RepPath & """"
Ou de mettre un antislash à la fin de la chaine?
Code :
RepPath = RepPath & "\"
Bonne continuation.
pitchalov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 14h52   #5
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Salut pitchalov !

D'abord merci de ta réponse.
Je vais tester dès que possible, mais pour l'instant je redescends une image sur mon pc de test ...
(bon j'avoue je le malmène ... mais il est là pour ça !)
J'ai l'impression que c'est le système qui plante, plus que mon code vbs en fait.
Je vous tiens au courant !

En tous cas :
Code :
RepPath = RepName & "a" & Right("0000" & i, 5)
Ça me plait beaucoup !
C'est bien plus joli et beaucoup plus efficace.

(Moi j'en suis encore au stade "Si ça marche, c'est déjà pas mal !" )
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 15h26   #6
Rédacteur
 
Avatar de omen999
 
Inscription : février 2006
Messages : 787
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 787
Points : 1 982
Points : 1 982
il ne faut pas toujours prendre à la lettre le param Caract. n dans le message d'erreur renvoyé par wsh
comme la ligne 15 teste à la fois l'existence du fichier et cherche à le supprimer, je décomposerais cette ligne pour lever le doute, folderexist n'est pas toujours robuste ...
et quel est ton os ?
il est possible qu'ils soient protégés à partir de vista ou wk2003
__________________
nomen omen, nemo non omen
le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
pas de questions techniques par mp
omen999 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 16h11   #7
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Merci également de ton intervention Omen999.

Bien j'ai tout essayé ...

. Les guillemets -> pareil
. Ajouter un slash -> pareil
. Dissocier tests d'existence et suppression -> pareil
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
StrComputer = wscript.arguments(0)
 
RepName = "\\" & StrComputer & "\c$\Documents and Settings\"
 
		For i = 1 TO 99999
 
		RepPath = RepName & "a" & Right("0000" & i, 5)
 
			If oFSO.FolderExists(RepPath) = True Then
			test = 1
			else
			test = 0		
			end if
 
		if test = 1 then oFSO.DeleteFolder RepPath, True
 
		Next
Citation:
Ligne : 17
Caract. : 20
Erreur : chemin d'accès introuvable
Code : 800A004C
Serait-ce lié au fait de vouloir supprimer un répertoire distant ?
J'ai pourtant bien les droits nécessaire dans la session que j'utilise ...
Je vais tester en mappant un lecteur ... demain ...

Encore merci de m'avoir lu ! Bonne soirée à tous !
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 15h13   #8
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Bonjour à tous !

Bien après quelques tests supplémentaires, il semble en effet que j'aie un souci de droits ...

Je n'ai pas géré la question des droits dans mon script puisque la session que j'utilise pour le lancer fait partie d'un groupe qui est administrateur local de tous les postes de travail.

Etat des lieux :

En ligne de commande, j'ai bien les droits :
Code :
C:\>RD "\\PC_DISTANT\c$\Documents and Settings\Profil" /s /q
---> ok

Avec un mapping réseau préalable, ça fonctionne aussi :
Code :
1
2
3
4
5
6
7
8
9
10
11
[...]
If OFSO.DriveExists("Z:") Then objNetwork.RemoveNetworkDrive "Z:"
wshnetwork.MapNetworkDrive "Z:","\\" & StrComputer & "\C$"
RepPath = "Z:\Documents and Settings"
 
For each oFld in oFSO.GetFolder(RepPath).SubFolders
 
	oFSO.DeleteFolder oFld, True
 
Next
[...]
---> ok

Mais en tentant une suppression directe du répertoire, ça ne fonctionne pas :
Code :
1
2
3
4
5
6
7
8
9
[...]
RepPath = "\\" & StrComputer & "\c$\Documents and Settings"
 
For each oFld in oFSO.GetFolder(RepPath).SubFolders
 
	oFSO.DeleteFolder oFld, True
 
Next
[...]
---> Pas ok

Pourquoi ?

Le souci est que le mapping d'un lecteur ne convient pas pour ce que je cherche à faire.
Je ne peux pas me permettre d'attendre qu'un poste soit nettoyé pour passer au suivant ...
Je dois pouvoir nettoyer plusieurs postes en même temps et donc appeler le .vbs de nettoyage depuis un script .vbs principal.

Je n'arrive pas à trouver de solution, ni même une bidouille pour me sortir de cette impasse ...
Auriez-vous une idée ?
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 15h32   #9
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
Salut,

Ton problème me fait penser à un blocage de l'UAC (User account control).
C'est une sécurité en place par défaut sur les OS Vista et Seven.
Si c'est ton cas, vérifie que le problème vient de là en désactivant l'UAC sur un poste et en refaisant tes tests, pour voir.

Sinon, au vu de ton problème de droits, peut-être que tu peux essayer de lancer tes scripts à distance sur les postes, avec psExec par example (outil des PsTools de la SysInternal suite).

Bonne continuation.
pitchalov est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 16h04   #10
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Hé hé j'espère bien qu'on aura jamais de vista sur le parc de l'entreprise ... quant à windows 7, je ne pense pas que se soit pour tout de suite ...

Non, config entreprise 'standard' : WinXP_Sp3 sur postes utilisateurs (ainsi que le poste de test que j'utilise) et Win2003_Server sur la plupart des serveurs.

Concernant les PsTools, j'aimerais bien ne pas avoir à installer de logiciels tiers et surtout le but (final) de mon p'tit programme est de pouvoir être activé pendant la nuit par une tâche programmée et qu'il tourne tout seul comme un grand.

Pour tout t'avouer, ce genre d'outil existe déjà (delprof par ex.), mais c'est justement pour éviter d'avoir à l'utiliser que je me suis lancé dans cette galère !
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 16h24   #11
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
A toi de voir.
Mais je ne vois pas d'autre alternative à ton problème, si tes droits ne te permettent pas de faire ces suppressions.

Par contre contrairement à ce que tu crois, psExec est un utilitaire portable et gratuit. Il n'a pas à être déployé sur les postes clients : tu lance la commande psExec sur ton poste avec les droits qui vont bien vers des postes distants et le code s'exécute à distance.

Ton objectif de lancement par tâche planifiée la nuit peut donc sans problème se faire avec cet outil.

Bonne continuation.
pitchalov est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 16h34   #12
Rédacteur
 
Avatar de omen999
 
Inscription : février 2006
Messages : 787
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 787
Points : 1 982
Points : 1 982
Citation:
j'aimerais bien ne pas avoir à installer de logiciels tiers
psexec n'est pas/plus vraiment un logiciel tiers mais un utilitaire officiel "made by MS®"...
__________________
nomen omen, nemo non omen
le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
pas de questions techniques par mp
omen999 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 16h03   #13
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Bien bien bien ... c'est vrai que les pstools semblent être une bonne idée, mais malheureusement ils apportent une autre problématique à ma situation.

En effet, au début de mon code de nettoyage, il y a un reboot du poste distant :
Code :
WSHShell.Run ("C:\WINDOWS\system32\shutdown.exe -m \\" & StrComputer & " -r -f -t 0")
Ca risque de poser problème pour la suite de l'éxecution du script ...
Je suis contraint de redémarrer le poste pour libérer les ruches HKU du registre.
Sinon j'ai toujours des fichiers NTUSER.DAT en cours d'utilisation qui ne peuvent être supprimés.
(utilisateurs multiples et postes rarement redémarrés, simples fermetures de session en général)
Et vu mon niveau en VBS, je vais éviter de jouer avec la base de registre.

Bien c'est ce que l'on appelle tomber de Charybde en Scylla, je crois ...
Je pense donc que je vais me contenter de la solution "mapping d'un lecteur" et nettoyage séquentiel ...
Il faut juste que j'estime correctement combien de postes je peux programmer par nuit.

Merci en tous cas de vous être creusé les méninges pour moi.
A une prochaine !
++
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 12h19   #14
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Bonjour,

Je prends le temps aujourd'hui de clore ce sujet.
Je voulais d'abord adresser un grand MERCI à tous les contributeurs, votre aide a été déterminante !

Principe de fonctionnement du script :
1. Une tâche planifiée lance le script principal
2. Le script principal lance le reboot des machine du parc.
3. Il attend le redémarrage des machine
4. Il lance le script secondaire de nettoyage sur les machine distance via PSEXEC.

L'énorme avantage de cette méthode est que chaque poste s'auto-nettoye et utilise ses propres ressources. Du coup je peux nettoyer l'ensemble du parc en même temps !

Voici la commande PSEXEC utilisée dans le script principal :
Code :
WSHShell.Run ("psexec \\" & nom_pc(i) & " -d -u domaine\administrateur -p mdpadmin -e c:\windows\system32\wscript " & Rep_du_Script & "\cleaner.vbs")
Le script secondaire "cleaner.vbs" ressemble à ça :
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
Dim oFSO, oSh, profil()
Set oSh = CreateObject("WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
Rep_Courant = WScript.ScriptFullName
Rep_Courant = left(Rep_Courant,InStrRev(Rep_Courant,"\"))
 
' Profils à conserver
Redim profil(5)
profil(1) = "administrateur"
profil(2) = "all users"
profil(3) = "default user"
profil(4) = "localservice"
profil(5) = "networkservice"
 
RepPath = "C:\Documents and Settings\"
	For each oFld in oFSO.GetFolder(RepPath).SubFolders
		protect = 0
		n = InStrRev(oFld, "\")
		Suppr_profil = Mid(oFld, n + 1)
 
		' on teste que le répertoire courant ne soit pas un des 5 à conserver
		For j = 1 to 5
		test = "c:\Documents and Settings\" & profil(j)
		If lcase(test) = lcase(oFld) Then protect = protect + 1
		Next
 
		' on supprime de répertoire
		If protect = 0 Then Set oExec = oSh.Exec ("WScript " & Rep_Courant & "Sub_Delete.vbs " & Suppr_profil)
	Next
WSCript.Quit
Et le script de suppression "Sub_Delete.vbs" :
Code :
1
2
3
4
5
6
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
rep = "c:\Documents and Settings\" & wscript.arguments(0)
on error resume next
oFSO.DeleteFolder rep, True
WScript.Quit
La problématique n'était pas simple et mon niveau insuffisant.
Aujourd'hui j'ai un outil qui fonctionne et j'ai fait plein de progrès !
Merci une fois encore d'avoir pris le temps de répondre à mes questions !
++
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 15h46   #15
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,

Ravi que tu sois arrivé à tes fins sur ce sujet.
A moins que cela correspondent à des besoins particuliers, je ne pense pas que 2 scripts soient nécessaires pour faire cette opération.
Je te propose donc ,au cas où tu sois intéressé, une petite évol de ton script cleaner.vbs, qui fait exactement les mêmes actions que tes 2 scripts (en un seul cette fois), et d'une écriture un peu remaniée (à mon goût plus lisible, après faut voir pour toi) :
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
Function StrInArr(strIn, 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
 
Sub RmFolder(folderPath)
	Dim oFSO
	Set oFSO = CreateObject("Scripting.FileSystemObject")
	On Error Resume Next
	oFSO.DeleteFolder folderPath, True
	Set oFSO = Nothing
End Sub
 
' Main
Dim oFSO, oFld
Dim arrProfil
Dim RepPath
 
' Profils à conserver
arrProfil = Array("administrateur", "all users", "default user", "localservice", "networkservice")
 
Set oFSO = CreateObject("Scripting.FileSystemObject")
RepPath = "C:\Documents and Settings\"
For each oFld in oFSO.GetFolder(RepPath).SubFolders
	' Si le nom du répertoire n'est pas dans le tableau "arrProfil", on supprime le répertoire
	If NOT StrInArr(oFld.Name, arrProfil) Then RmFolder oFld.Path
Next
 
Set oFSO = Nothing
Set oFld = Nothing
 
WSCript.Quit
Bonne continuation
pitchalov est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/02/2012, 16h19   #16
Membre régulier
 
Homme
Administrateur systèmes et réseaux
Inscription : novembre 2011
Messages : 64
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : novembre 2011
Messages : 64
Points : 74
Points : 74
Bien sûr que je suis intéressé !

J'aime beaucoup ton approche, plus efficace et bien plus agréable.
C'est toujours un plaisir de lire ton code ! (bah ça si c'est pas une phrase de geek ... )

Je me rends bien compte que j'ai encore des progrès à faire avant de pouvoir prétendre à coder en finesse, comme toi !
Merci encore
++
Cachlab est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h49.


 
 
 
 
Partenaires

Hébergement Web