Question
recherche sans fin et surveillance d'un programme
- Thierry
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 42
- Remerciements reçus 0
Je vous soumets deux questions pour lesquelles je n'ai pas trouvé de solutions :
1- une recherche get-childitem sans fin... :
J'ai écrit un script qui, entre autres, liste les dossiers contenant les \"favoris\" de IE sur un disque externe...en soit c'est simple :
[code:1]$listefavoris = @(get-childitem \"$lettrelecteur\users\*\\" -recurse -Force -ErrorAction silentlycontinue -include \"Favorites\" | where-object { $_.PSIsContainer -like \"true\" } ) [/code:1]
Là où je sèche c'est que si je lance la recherche sur ma partition système \"c:\\" (seven 32bits) elle semble ne jamais aboutir alors que tout fonctionne très bien sur une image disque montée (seven 64bits) et que bien plus tout marchait très bien il y a quelques semaines...
donc pour moi il n'y,a aucune raison que cela plante aujourd'hui...si vous avez une idée je suis preneur...
Pour info je suspecte :
- la mise à jour seven XP1
- les reparse point...
-2 : surveillance d'un executable :
J'utilise un utilitaire pour exploiter une liste de fichiers \"index.dat\", le problème c'est que certains de ces fichiers ne sont pas bien pris en charge par l'utilitaire qui bloque...Aussi je souhaiterais, pour chaque lancement de l'utilitaire, détecter l'heure du lancement et tuer le process s'il reste actif plus de deux minutes...mais je ne vois pas trop comment faire...une idée ?
Merci à tous.<br><br>Message édité par: thierry92, à: 16/07/11 17:27
Connexion ou Créer un compte pour participer à la conversation.
- Thierry
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 42
- Remerciements reçus 0
Après vérifications et tests :
1 - a priori c'était pas un problème lié à Powershell ou à Windows mais plutôt à moi....visiblement j'avais créé des liens symboliques vers les points de restauration du volume C:...donc la recherche portait sur C:\ et toutes ses sauvegardes....donc la recherche portait sur 3 ou 4 fois la partition originale...
2 - je vais essayer cela :
# on lance l'exécutable pour chaque fichier \"index.dat\" :
start-process -filepath \"$pasco\" -ArgumentList \"$($indexdat.fullname)\" -RedirectStandardOutput \"$($nomcsv)\" -wait
While (get-process -Name pasco.exe)
{
$duree = Get-Process -Name pasco.exe
if ($($duree.starttime.timeofday.minutes) -gt 2)
{
kill pasco.exe
echo \"un process tué !\"
}
}
enfin pas sûr que cela marche...merci de vos commentaires éclairés
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
consulte ce post .
Sinon, essaie cette construction :
[code:1]
try {
$Process=Start-Process \"FullPathName\pasco.exe\" -PassThru
Wait-Process $Process.id -Timeout 120 -ErrorAction Stop
} catch [System.Management.Automation.ActionPreferenceStopException]
{
if ($_.Exception -is [System.TimeoutException]) # cas du timeout sur Wait-Process
{
If (-not $Process.HasExited) #si le process est tjr actif
{
$Process.Kill()
}
}
else
{Throw $_}
}
[/code:1]
A tester...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thierry
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 42
- Remerciements reçus 0
Juste pour être sûr que j'ai bien compris :
- le try-catch permet de gérer les erreurs liées au lancement de mon utilitaire.
- on \"catch\" plus précisément les erreurs de type \"ActionPreferenceStopException\" et dans ces dernières on affecte un traitement particulier aux exceptions du type \"TimeoutException\",
- si le process est toujours actif on le supprime en silence et on \"envoie\" les autres erreurs...
Pourrais tu m'expliquer le raisonnement qui t'a permis d'arriver à cette solution...car visiblement je n'ai pas pris le problème du bon côté...
Dans tous les cas merci de ton aide
Thierry
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Vaudrait mieux car je vais le passer en prodMerci beaucoup pour cette solution qui fonctionne très bien d'après mes premiers tests
thierry92 écrit:
Pas tout à fait, je ne gére pas d'erreur d'un utilitaire en particulier.- le try-catch permet de gérer les erreurs liées au lancement de mon utilitaire.
thierry92 écrit:
Oui.- on \"catch\" plus précisément les erreurs de type \"ActionPreferenceStopException\"
thierry92 écrit:
Oui, avec cette précision \"et dans cette dernière\" car il ne peut y avoir qu'une.et dans ces dernières on affecte un traitement particulier aux exceptions du type \"TimeoutException\",
thierry92 écrit:
Oui.- si le process est toujours actif on le supprime en silence
thierry92 écrit:
Non, le redéclenchement d'exception ne se fait que s'il s'agit d'une exception autre que 'TimeoutException'.et on \"envoie\" les autres erreurs...
thierry92 écrit:
Pour moi sous Powershell , 'penser' objet d'abord, cmdlet ensuite, après comme on veut comme on peutcar visiblement je n'ai pas pris le problème du bon côté...
On effectue un traitement (Wait) sur un objet (Process), mine de rien cette évidence n'est pas trivial.
Il me semble que nombreux utilisateurs(trices) de PS passent à côtè du principe Verbe-Nom alors qu'il est au coeur de ce shell.
Nous en sommes tous à vouloir 'faire' au lieu de réfléchir 'au comment faire', cela ne nécessite certes pas le même investissement...
thierry92 écrit:
Ah pas facile !Pourrais tu m'expliquer le raisonnement qui t'a permis d'arriver à cette solution...
C'est déjà un tâtonnement pour répondre à un problème un peu particulier, à savoir un process (WinWise) qui se termine tjr sans erreur, adieu $LastExitCode...
Ce process 'lance' un thread GUI, enfin il me semble (peu de temps pour creuser, juste pour trouver) qui, lui, effectue le traitement, le premier process n'est donc qu'un lanceur.
En utilisant Wait-process, le lanceur ne me rend la main qu'une fois terminé le traitement réel.
Dans mon cas le timeout me permet de continuer mon traitement sur une erreur gérée, sans laisser le script se transformer en mort-vivant ou vivant-mort, ça marche dans les deux sens ici
Quant à l'usage de ErrorAction c'est le principe CBP (ceinture, bretelle, parachute), tout ce que je veux c'est que la sortie du Wait-Process signifie 'une fin de process sans erreur'.
En passant, après qq tests unitaires, ce n'est pas tout à fait le cas, mais je me suis arrêté là car à l'impossible nul n'est tenu !
Donc en lisant ton post, ce code me semblait approprié. Une dernière chose, je pense que l'on étudie pas assez, moi le premier, les exemples de la doc de PS, puisque cette approche s'y trouve
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thierry
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 42
- Remerciements reçus 0
Merci pour tes précisions sur le code....tout est clair désormais !
Merci également d'avoir précisé comment tu étais arrivé à ce résultat...
Je connaissais la commande \"wait-process\" mais pourtant je n'ai pas cherché dans cette voie...(malheureusement
La difficulté principale est effectivement de déterminer par quel angle attaquer un problème et de faire le bon choix ce qui demande de bien connaitre les commandes mais aussi de bien appréhender le mode de fonctionnement de Powershell (cmdlt, erreurs,...).
L'avantage de ce forum c'est justement de découvrir différentes façons de résoudre un problème et grâce aux extraits de code publiés d'essayer de comprendre un peu mieux le fonctionnement de PS.
Enfin j'ai encore du boulot...
Thierry
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- recherche sans fin et surveillance d'un programme