Question recherche sans fin et surveillance d'un programme

Plus d'informations
il y a 14 ans 10 mois #9923 par Thierry
Bonjour à tous et merci d'avance à ceux qui prendront un peu de temps pour m'aider :)

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.

Plus d'informations
il y a 14 ans 10 mois #9924 par Thierry
Bonjour,

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 \&quot;index.dat\&quot; :
start-process -filepath \&quot;$pasco\&quot; -ArgumentList \&quot;$($indexdat.fullname)\&quot; -RedirectStandardOutput \&quot;$($nomcsv)\&quot; -wait
While (get-process -Name pasco.exe)
{
$duree = Get-Process -Name pasco.exe

if ($($duree.starttime.timeofday.minutes) -gt 2)
{
kill pasco.exe
echo \&quot;un process tué !\&quot;
}

}
enfin pas sûr que cela marche...merci de vos commentaires éclairés ;)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 10 mois #9927 par xyz
Salut,
consulte ce post .
Sinon, essaie cette construction :
[code:1]
try {

$Process=Start-Process \&quot;FullPathName\pasco.exe\&quot; -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.

Plus d'informations
il y a 14 ans 10 mois #9935 par Thierry
Merci beaucoup pour cette solution qui fonctionne très bien d'après mes premiers tests :)

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 \&quot;catch\&quot; plus précisément les erreurs de type \&quot;ActionPreferenceStopException\&quot; et dans ces dernières on affecte un traitement particulier aux exceptions du type \&quot;TimeoutException\&quot;,
- si le process est toujours actif on le supprime en silence et on \&quot;envoie\&quot; 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.

Plus d'informations
il y a 14 ans 10 mois #9938 par xyz
thierry92 écrit:

Merci beaucoup pour cette solution qui fonctionne très bien d'après mes premiers tests :)

Vaudrait mieux car je vais le passer en prod :-)
thierry92 écrit:

- le try-catch permet de gérer les erreurs liées au lancement de mon utilitaire.

Pas tout à fait, je ne gére pas d'erreur d'un utilitaire en particulier.
thierry92 écrit:

- on \&quot;catch\&quot; plus précisément les erreurs de type \&quot;ActionPreferenceStopException\&quot;

Oui.
thierry92 écrit:

et dans ces dernières on affecte un traitement particulier aux exceptions du type \&quot;TimeoutException\&quot;,

Oui, avec cette précision \&quot;et dans cette dernière\&quot; car il ne peut y avoir qu'une.
thierry92 écrit:

- si le process est toujours actif on le supprime en silence

Oui.
thierry92 écrit:

et on \&quot;envoie\&quot; les autres erreurs...

Non, le redéclenchement d'exception ne se fait que s'il s'agit d'une exception autre que 'TimeoutException'.
thierry92 écrit:

car visiblement je n'ai pas pris le problème du bon côté...

Pour moi sous Powershell , 'penser' objet d'abord, cmdlet ensuite, après comme on veut comme on peut ;-)
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:

Pourrais tu m'expliquer le raisonnement qui t'a permis d'arriver à cette solution...

Ah pas facile !
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 :lol:

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 14 ans 9 mois #9942 par Thierry
Bonsoir,

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 \&quot;wait-process\&quot; 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.

Temps de génération de la page : 0.051 secondes
Propulsé par Kunena