Question Start-Transcript dans differents fichiers

Plus d'informations
il y a 15 ans 5 mois #2957 par Tarik
Bonjour,

Les initiés doivent connaitre la magnifique commande qu'est Start-Transcript!

Comment est il possible de savoir si celle ci est déjà éxécuté?:whistle:

J'aimerais éxécuter plusieurs scripts à partir d'un seul et recupérer dans différent fichier log les commands passé pour chacun de ces scripts.

Est ce possible?

merci pour vos éclaircissements.

Tarik<br><br>Message édité par: Tartar, à: 14/10/08 15:17

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

Plus d'informations
il y a 15 ans 5 mois #2981 par Robin Lemesle
Hi,

Comment est il possible de savoir si celle ci est déjà éxécuté?


Pas évident de savoir si la commande est déjà exécutée. Il doit y avoir plusieurs solutions, comme regarder son dernier accès en écriture. Sinon saches qu'un start-transcript se termine en fin de session.

J'aimerais éxécuter plusieurs scripts à partir d'un seul et recupérer dans différent fichier log les commands passé pour chacun de ces scripts.


Je pense que oui, il faut simplement insérer le start et stop transcript dans chaque script (et/ou éventuellement renvoyer un résultat vers la console pour que celui-ci soit enregistré dans le fichier).

Robin MVP PowerShell

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

Plus d'informations
il y a 15 ans 5 mois #3006 par Laurent Dardenne
Salut,
Tartar écrit:

Comment est il possible de savoir si celle ci est déjà éxécuté?

Si une transaction est en cours une exception est levée :
[code:1]
&amp;{trap [System.InvalidOperationException] {Continue #Une transcription est en cours, on continue}
&amp;{Start-transcript}
}
[/code:1]
Il est possible d'utiliser une variable pour déterminer le nom du fichier de log: $Transcript
De plus le fichier de log ($Transcript) est verrouillé pendant l'enregistrement.
Robin écrit:

J'aimerais exécuter plusieurs scripts à partir d'un seul et recupérer dans différent fichier log les commands passé pour chacun de ces scripts.

Je pense que oui, il faut simplement insérer le start et stop transcript dans chaque script (et/ou éventuellement renvoyer un résultat vers la console pour que celui-ci soit enregistré dans le fichier).

Le problème est qu'un script peut contenir plusieurs cas de terminaison (return) et PS ne dispose pas de bloc Finally (tjr exécuté à la fin) qui aurait pu répondre à ce besoin :/ .
C'est donc le script appelant qui doit gérer \&quot;la fin du script\&quot;.

On peux faire ceci :
[code:1]
# --functions globales

function Get-ScriptDirectory([Int] $MyScope=1)
{ #Scope = 1, renvoi le nom du répertoire du script parent, celui appelé sur la ligne de commande.
#Scope = 2 si l'appel à lieu dans une fonction au sein d'un script appelé via la ligne de commande.
#Scope = n Portée n...
# By J.Snoover (adapté)
$Invocation = (Get-Variable MyInvocation -Scope $MyScope).Value
$Invocation.MyCommand.Path
}

Function BeginLog
{
$CurrentScriptName=$(Get-ScriptDirectory 2)
#Si la transcription est active on l'arrête afin d'en mettre une nouvelle en place.
trap [System.InvalidOperationException] {Continue}
&amp;{
Stop-Transcript &gt;$null
Start-Transcript -Path \&quot;$CurrentScriptName.Log\&quot; -Append &gt;$null
}
Start-Transcript -Path \&quot;$CurrentScriptName.Log\&quot; -Append &gt;$null
}

Function EndLog
{
Stop-Transcript &gt;$null
}
[/code:1]
Ensuite le script appelant d'autres scripts :
[code:1]
#Prépare la session
#Delete -recurse *.log ou Move-item *.log...

#Initialise la transcription du script courant si besoin
BeginLog
#fait qq chose...

.\Script1.ps1 #Call BeginLog, si une transcription existe on en démarre une nouvelle
.\Script2.ps1 #Call BeginLog, idem
.\Script3.ps1 #Call BeginLog, idem
EndLog # Stop la transcription courante, celle de .\Script3.ps1 sinon ce script l'utilisera

#fait qq chose...

#Reprend la transcription du script courant si besoin
BeginLog
[/code:1]
Les fichiers de log sont placés dans le répertoire du script appellé et porte l'extension .log (c:\temp\script.ps1.log).

La transcription se fait en mode append car l'appel d'un script peut se faire dans le corps d'une boucle.

L'appel suivant en mode console fonctionne correctement :
[code:1]
.\Script1.ps1 #Call BeginLog
EndLog
[/code:1]
et celui-ci aussi
[code:1]
&amp;FullPathName\Script1.ps1
EndLog
[/code:1]
Ensuite on peut ajouter un mécanisme autorisant ou non le déclenchement de la transcription et/ou placer les fichiers de log dans un répertoire dédié.

Tutoriels PowerShell

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

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