[PowerShell] Générer des logs depuis vos scripts avec 2 lignes de code

Si vous faites beaucoup de scripting en PowerShell (et vous avez bien raison d’en faire ! Smile), vous aurez surement eu à générer des logs pour tracer l’exécution de vos scripts. Et, bien souvent, on implémente nos propres fonctions d’écriture de fichiers.
Quand on veut tracer des scripts dans des fichiers texte, on a beaucoup plus simple, toutefois. Les commandes Start/Stop-Transcript sont faites exactement pour ça.

Elles servent à loguer chaque commande tapée par l’utilisateur et tout ce qui apparait dans un flux de sortie (standard, erreur, verbose…) entre le Start et le Stop.

Ainsi, le script suivant :

Start-Transcript test.rtf
Write-Host "test host" -ForegroundColor Green
Write-Output "test output"
Write-Error "Test error"
Write-Verbose "This is verbose text"

Stop-Transcript

Générera un log ci-dessous :

image

Simple, non ?

Il y a quelques précautions à prendre, toutefois.

Premièrement, il faut penser à appeler Stop-Transcript pour fermer le fichier de log. N’oubliez pas de le faire également dans vos blocs de gestion d’erreurs. Omettre la fermeture causera une erreur si on essaye d’accéder à nouveau au fichier.

Ensuite, que préférer, Write-Host ou Write-Output ? Les 2 sont tracées par Start-Transcript et les 2 permettent d’afficher du texte. Write-Host permet en plus de contrôler l’affichage en incluant ou pas un retour chariot et en changeant les couleurs de texte et d’arrière-plan. On serait donc tenté d’utiliser Write-Host mais,dans certains cas, il peut poser problème.

Imaginons que l’on essaye d’invoquer un Write-Host depuis une application console C# avec le code suivant (tordu, j’en conviens, mais nombre de produits serveur font des invocations PowerShell) :

using System.Management.Automation;
using System.Management.Automation.Runspaces;

namespace PSAutomation
{
    class Program
    {
        static void Main(string[] args)
        {
            Runspace runspace = RunspaceFactory.CreateRunspace();

            runspace.Open();

            using (PowerShell shell = PowerShell.Create())
            {
                shell.Runspace = runspace;
                Command cmd = new Command("Write-Host");
                cmd.Parameters.Add("Object", "toto");

                shell.Commands.AddCommand(cmd);
                shell.Invoke();
            }
            runspace.Close();
        }
    }
}

Voilà ce qui va se passer :

image

Ce qui s’explique car “l’hôte” courant n’est pas un shell mais un runspace sans gestion de l’affichage. Tandis que la sortie standard utilisée par Write-Output, elle, existe toujours.

Pour tous mes scripts où j’ai besoin d’avoir des logs, je n’utilise maintenant plus que les Transcript et des Write-Output/Error (enrobés dans des fonctions qui ajoutent un TimeCode en début de ligne). Vous pourrez obtenir plus de détails avec la commande “man Start-Transcript –full”.

Bons logs !

Publié mercredi 25 janvier 2012 16:41 par Pierrick CATRO-BROUILLET
Classé sous
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires


Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01