Question Arrêt d'un job en remote

Plus d'informations
il y a 15 ans 4 mois #7974 par Pauline
Arrêt d'un job en remote a été créé par Pauline
Bonjour,

J'ai un script qui appelle un script sous-jacent en remote en mode \"AsJob\" :

[code:1]
$PSSession = New-PSSession -ComputerName $ServerB
Invoke-Command -Session $PSSession -filepath \"C:\script.ps1\" -AsJob | Out-Null
[/code:1]

Ce script sous-jacent (script.ps1) contient le bout de code suivant :
[code:1]
New-PSDrive -Name P -PSProvider FileSystem -Root \\$ServerA\C$\$Directory -Scope Script | Out-Null
try {
$LocalFile = Get-Content \"C:\$Directory\$File\" -ErrorAction Stop
$RemoteFile = Get-Content \"P:\$File\" -ErrorAction Stop
Compare-Object $LocalFile $RemoteFile
}
catch {
\"Echec\" | Out-File \"C:\Echec.txt\"
}
[/code:1]

Dans le code, la variable $ServerA correspond au serveur initial sur lequel je lance le script. En gros, je lance un script à partir du serveur A qui lance un job sur le serveur B, qui lui-même mappe un lecteur du serveur A.

Mon problème est que lors de l'exécution du deuxième Get-Content, le job s'arrête et son état se positionne à 'Failed' sans passer par le catch. Ceci est un comportement que je ne comprends pas.
En effet, si le Get-Content échoue, l'erreur est sensée être \"catchée\" et s'il fonctionne, le job devrait continuer à s'exécuter.

Ce qui est étrange aussi est que je ne rencontre ce problème que sur un seul de mes 4 environnements.

Quelqu'un aurait-il déjà rencontré ce type de soucis ?

Merci,
Pauline.

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

Plus d'informations
il y a 15 ans 4 mois #7975 par Laurent Dardenne
Salut,
peux-tu reformater les portions de code ?
Pour le moment( balises HTML) c'est illisible.

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 4 mois #7979 par Jacques Barathon
Voici, pour ce que j'en comprends, les bouts de code dépouillés de leurs tagesques oripaux :

[code:1]
$PSSession = New-PSSession -ComputerName $ServerB
Invoke-Command -Session $PSSession -filepath \"C:\script.ps1\" -AsJob | Out-Null
[/code:1]

script.ps1:
[code:1]
New-PSDrive -Name P -PSProvider FileSystem -Root \\$ServerA\C$\$Directory -Scope Script | Out-Null
try {
$LocalFile = Get-Content \"C:\$Directory\$File\" -ErrorAction Stop
$RemoteFile = Get-Content \"P:\$File\" -ErrorAction Stop
Compare-Object $LocalFile $RemoteFile
}
catch {
\"Echec\" | Out-File \"C:\Echec.txt\"
}
[/code:1]

Cela dit, ça ne me dit pas grand chose sur la raison de l'échec. A part que - peut-être, créer un drive avec un scope limité au script alors que ce qui est passé par InvokeCommand ne sera pas vu comme un script par l'ordinateur distant, c'est peut-être ça qui cause l'erreur quand le drive est sollicité par le get-content ?

Quoi qu'il en soit, un répertoire qui n'est pas trouvé n'est pas une erreur critique, donc cette erreur ne me paraît pas devoir être capturée par la clause try.

A la place, essaie de tester la valeur de $? juste après le get-content. Si la valeur est $true, la commande s'est bien passée. Sinon, il y a eu une erreur, et tu peux interroger $error[0].

Dis-nous en plus si tout ça ne suffit pas (ou est carrément à côté de la plaque, c'est possible aussi)...

Janel

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

Plus d'informations
il y a 15 ans 4 mois #7983 par Pauline
Réponse de Pauline sur le sujet Re:Arrêt d'un job en remote
Merci janel d'avoir traduit mon script effectivement illisible.

janel écrit:

Cela dit, ça ne me dit pas grand chose sur la raison de l'échec. A part que - peut-être, créer un drive avec un scope limité au script alors que ce qui est passé par InvokeCommand ne sera pas vu comme un script par l'ordinateur distant, c'est peut-être ça qui cause l'erreur quand le drive est sollicité par le get-content ?


Ici, le scope ne change rien. J'ai essayé avec un scope local et ça n'a rien changé.

janel écrit:

Quoi qu'il en soit, un répertoire qui n'est pas trouvé n'est pas une erreur critique, donc cette erreur ne me paraît pas devoir être capturée par la clause try.


En fait, c'est pour que le try/catch fonctionne que mes Get-Content utilisent l'option \"-ErrorAction Stop\". Ce qui est effectivement le cas dans mes autres fonctions.

janel écrit:

A la place, essaie de tester la valeur de $? juste après le get-content. Si la valeur est $true, la commande s'est bien passée. Sinon, il y a eu une erreur, et tu peux interroger $error[0].


Il n'y a pas de $? à tester ni de $error[0] à afficher. Le job s'arrête (sans rien dire) alors qu'il est exécute Get-Content.

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

Plus d'informations
il y a 15 ans 4 mois #7991 par Jacques Barathon
Curieux en effet. Je viens de faire un test rapide entre deux \"serveurs\" (un sous W7 et l'autre sous XP, on fait ce qu'on peut...) et le catch marche bien comme prévu si le get-content échoue.

As-tu vérifié que dans l'environnement qui ne marche pas tu peux bien écrire le fichier echec.txt ? A savoir, il y a bien un disque C: et tu as bien accès en écriture sur la racine de ce disque ?

Sinon, en supprimant la redirection vers echec.txt et en lançant l'invoke-command en mode interactif, tu peux vérifier si tu vois ou non le mot \"echec\" s'afficher, et donc de valider si le script accède bien à la section Catch ou s'il la zappe complètement.

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

Plus d'informations
il y a 15 ans 4 mois #8064 par Pauline
Réponse de Pauline sur le sujet Re:Arrêt d'un job en remote
Bonjour,

Après une analyse de mon problème un peu plus poussée, j'ai constaté que dans l'observateur d'événements Windows, dans la catégorie \"Application\", deux erreurs .NET apparaissent exactement au moment où mon script plante sans rien dire :
  • Id Evt 123 : .NET Runtime version 2.0.50727.3053 - Fatal Execution Engine Error (7A0F3BA4) (800703e9) Pour plus d'informations, consultez le centre Aide et support à l'adresse go.microsoft.com/fwlink/events.asp.
  • Id Evt 0 : La description pour l'ID d'événement ( 0 ) dans la source (.NET Runtime) est introuvable. L'ordinateur local n'a peut-être pas les informations de Registre ou les librairies requises pour afficher les messages émanant d'un ordinateur distant. Vous pourrez peut-être utiliser l'option /AUXSOURCE= pour récupérer cette description. Reportez-vous aux rubriques Aide et support pour plus de détails. Les informations suivantes font partie de l'événement : .NET Runtime version : 2.0.50727.3053 - Application ErrorApplication has generated an exception that could not be handled.
    Process ID=0x688 (1672), Thread ID=0xf38 (3896).
    Click OK to terminate the application.
    Click CANCEL to debug the application..

J'ai cherché des fix Microsoft pour ces erreurs .net et il n'y en a aucun qui fonctionne.

Quelqu'un aurait-il déjà rencontré un problème similaire ?

Merci,
Pauline

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

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