Hé, vous le Scripteur !Où sont les porte-gobelets ?

Les Scripteurs de Microsoft

Cette rubrique est basée sur une version préliminaire de Windows PowerShell. Toutes les informations contenues dans cette rubrique peuvent être amenées à évoluer.

Lorsqu'une nouvelle technologie est introduite, cela prend un peu de temps avant que le public puisse vraiment faire la différence entre la nouvelle technologie et ce qui existait précédemment. Prenons les premières automobiles, par exemple. Il y une raison pour laquelle ces engins étaient considérés comme des calèches sans chevaux : c'est en fait à peu près ce qu'elles étaient. En y réfléchissant, peut-être que la seule différence entre les premières automobiles et les calèches résidait dans le fait que les unes utilisaient des chevaux et les autres pas. À part ça, bien malin celui qui aurait pu les différencier.

Aujourd'hui, bien évidemment, peu de personnes confondraient une automobile avec une calèche. C'est qu'au fil du temps, les constructeurs automobiles ont fait les choses de telle sorte qu'on différencie maintenant clairement les voitures des calèches. Par exemple, les voitures d'aujourd'hui sortent de leurs usines équipées de lecteurs CD, de la climatisation et de systèmes de navigation par satellite ; peu de calèches peuvent en dire autant. De la même manière, imaginez que vous conduisiez une calèche dans les années 1880 et qu'à un moment, vous ayez eu besoin de poser le Frappuccino que vous tenez à la main ; désolé, vous n'avez vraiment pas de chance. De leur côté, certains utilitaires sportifs (SUV) disposent sur leur modèle de série de 17 porte-gobelets et il y a au moins une marque d'automobile qui propose trois porte-gobelets rien que pour le conducteur. Certains des modèles les plus récents disposent même de porte-gobelets capables de réchauffer ou de rafraîchir votre boisson si nécessaire.

Remarque En effet, il est dur de s'imaginer que les gens, à une époque, survivaient sans même avoir la possibilité de boire trois boissons différentes au volant. Comment peut-on imaginer conduire avec seulement une ou deux boissons à disposition ?

Avant qu'une technologie ne rencontre vraiment le succès, les gens ont besoin de savoir pourquoi ils doivent privilégier ce qui est nouveau et inconnu par rapport à ce qui est ancien et fiable. Lorsque les DVD sont sortis sur le marché, ils vous permettaient de regarder des films à la maison, exactement comme le faisaient les cassettes vidéo. En revanche, les DVD étaient plus chers que les cassettes vidéo et vous ne pouviez pas utiliser un lecteur DVD pour enregistrer vos propres programmes. Inutile de dire que les DVD n'ont pas pris le monde d'assaut ! En effet, il a fallu attendre que les fabricants de DVD commencent à truffer leurs disques de scènes coupées, de commentaires d'un acteur dont vous ignoriez même qu'il jouait dans le film et d'autres choses que vous ne pouviez pas avoir sur une cassette vidéo, pour que les DVD commencent à supplanter leurs contreparties VHS. Pouvoir regarder un film à la maison ne suffisait pas ; les fabricants de DVD ont dû fournir des options plus performantes que celles dont disposait déjà le public.

Remarque Le fait que les gens regardent ou pas les bonus importe peu : la nature humaine est ainsi faite que, lorsque quelque chose est disponible, vous n'avez de cesse de l'avoir. D'ailleurs, les Scripteurs projettent de sortir un DVD TechNet Magazine contenant principalement le texte supprimé des rubriques TechNet Magazine ainsi que des alternatives aux fins des scripts d'administration système.

Utilisation de Windows PowerShell

Windows PowerShell™, la nouvelle technologie de shell de commande et de script, sortie par Microsoft, en est un exemple. Lorsque les gens entendent parler de Windows PowerShell la première fois, on leur dit des choses du genre  :

  • "Windows PowerShell vous permet de gérer des processus et des services."
  • "Windows PowerShell vous permet de récupérer les événements dans vos journaux d'événements."
  • "Windows PowerShell vous permet d'utiliser WMI pour gérer les ordinateurs."

Toutes ces affirmations sont bien sûr correctes ; et ce sont toutes des tâches importantes et utiles. Le seul problème, c'est que vous pouvez déjà effectuer toutes ces tâches à l'aide de VBScript et de Windows Script Host. La compatibilité descendante est importante et Windows PowerShell ne constituerait pas une grande innovation s'il ne pouvait même pas effectuer les mêmes tâches que VBScript. (Imaginez un lecteur DVD qui ne pourrait pas lire de films. En fait, inutile d'imaginer cela : l'un des scripteurs en possède un chez lui.)

Dans le même temps, cependant, si Windows PowerShell n'effectue que les mêmes tâches que VBScript, alors pourquoi devrions-nous nous préoccuper de cette nouvelle technologie ? Il est vrai que VBScript n'est pas équipé de porte-gobelets ; et d'ailleurs Windows PowerShell non plus. Alors quelle importance que nous utilisions une technologie de script plutôt qu'une autre ?

À vrai dire, il est possible que cela ne fasse aucune différence. Ceci dit, mise à part l'absence de porte-gobelets, Windows PowerShell possède certaines capacités que VBScript n'a pas. Si tout ce que vous devez faire, c'est gérer des processus et des services, il n'y a pas vraiment d'urgence à ce que vous vous intéressiez à Windows PowerShell ; comme on dit, on ne change pas une équipe qui gagne ! (Pour les Scripteurs, cette maxime aurait plutôt tendance à vouloir dire "N'essayez pas de changer quelque chose sinon vous pourriez avoir de gros problèmes.") Windows PowerShell ne devient intéressant que s'il vous permet d'effectuer une tâche que VBScript ne peut pas faire. Quelque chose comme, disons, modifier l'heure de la dernière écriture d'un fichier.

Modification de l'heure de la dernière écriture

Oui, vous avez bien entendu : modifier l'heure de la dernière écriture d'un fichier. Pour diverses raisons (telle qu'une sorte de contrôle de version rapide et simple), les auteurs de scripts ont toujours rêvé du jour où ils pourraient modifier l'heure de la dernière écriture (ou l'heure de création) d'un fichier ou d'un ensemble de fichiers. Mais malheureusement, cette capacité n'existe ni dans Windows Management Instrumentation (WMI) ni dans FileSystemObject ; dans ces deux technologies, les dates et les heures sont en lecture seule.

Avec Windows PowerShell, cependant, remplacer l'heure de la dernière écriture d'un fichier par la date et l'heure actuelles est aussi facile que d'exécuter cette commande :

$a = Get-Item c:\scripts\test.txt; $a.LastWriteTime = Date

Avant d'expliquer le fonctionnement de cette commande, nous allons répondre à une question que tout le monde se pose sûrement : Comment Windows PowerShell peut-il modifier l'heure de la dernière écriture d'un fichier alors que WMI en est incapable ? Nous avons pensé que nous devions répondre à cette question avant tout autre chose simplement parce qui s'agit d'une idée fausse sur Windows PowerShell. Les gens ont tendance à croire que Windows PowerShell n'est qu'une nouvelle manière d'utiliser WMI. Certes, vous pouvez tout à fait utiliser Windows PowerShell pour accéder aux données WMI ; il est également vrai que, pendant que nous attendons que des cmdlets supplémentaires (natives de Windows Powershell) soient construites, la plupart des scripts d'administration système continueront de se baser principalement sur WMI. Au fond, cependant, Windows PowerShell se base sur .NET Framework et les cmdlets Windows PowerShell traitent généralement les objets .NET plutôt que les objets WMI. Et ceci est important car les propriétés disponibles via .NET Framework ne sont pas nécessairement les mêmes que celles disponibles via WMI.

Par exemple, lorsque nous utilisons la cmdlet Get-Item pour lier un fichier, on n'obtient pas une instance de la classe WMI CIM_Datafile en retour ; à la place, on obtient un objet .NET. Est-ce vraiment si grave ? Bien sûr que oui - l'objet .NET expose un ensemble de propriétés et des méthodes de gestion de fichiers légèrement différentes par rapport à WMI. Mais comme nous venons de le voir, ces légères différences peuvent s'avérer assez importantes, comme la différence entre une propriété de lecture seule et de lecture/écriture.

Une question piège : comment savons-nous qu'une cmdlet Get-Item renvoie un objet .NET ? Dans ce cas, comme dans la plupart des cas, la manière la plus facile de savoir à quel type d'objet on est confronté (ainsi que la manière la plus facile d'identifier les propriétés et les méthodes à votre disposition) consiste à lier le fichier, puis à transmettre cet objet à la cmdlet Get-Member :

Get-Item c:\scripts\test.txt | Get-Member

Les résultats de cette commande sont illustrés par la figure 1. Comme vous pouvez le voir, il s'agit bien d'un objet .NET (comme si les Scripteurs pouvaient se tromper sur quelque chose comme ça !)

Figure 1 Membres de l'objet renvoyé par Get-Item

   
TypeName: System.IO.FileInfo

Name                      MemberType     Definition
----                      ----------     ----------
AppendText                Method         System.IO.StreamWriter AppendText()
CopyTo                    Method         System.IO.FileInfo CopyTo(String destFileName),
                                         System.IO.FileInfo CopyTo(S...
Create                    Method         System.IO.FileStream Create()
CreateObjRef              Method         System.Runtime.Remoting.ObjRef CreateObjRef(
                                         Type requestedType)
CreateText                Method         System.IO.StreamWriter CreateText()

D'ailleurs, cette simple petite commande illustre deux des capacités les plus intéressantes de Windows PowerShell : le traitement « pipeline » et les méta-informations. Même si nous n'entrerons pas dans les détails techniques aujourd'hui, l'idée de base du traitement « pipeline » est que vous pouvez utiliser une cmdlet pour extraire un objet puis transférer cet objet vers un autre cmdlet. Dans cette commande nous avons utilisé la cmdlet Get-Item pour obtenir un objet représentant le fichier C:\Scripts\Test.txt puis nous avons transmis cet objet (en tant qu'objet) à la cmdlet Get-Member via le pipeline. (Le symbole | représente le pipeline dans une commande Windows PowerShell.)

Get-Member fait ensuite son travail, qui consiste à récupérer les propriétés et les méthodes pour l'objet récupéré. C'est l'une des fonctionnalités sympathiques de Windows PowerShell : il est très simple d'avoir accès aux méta-informations qui sont des informations sur les informations. En utilisant des cmdlets telles que Get-Member et Get-Command vous pouvez interroger Windows PowerShell comme vous le souhaitez et de la même façon, vous pouvez écrire un script WMI pour récupérer les informations sur les classes, les propriétés et les méthodes WMI qui sont à votre disposition.

Remarquez que Get-Member va un peu plus loin que ce que vous pouvez faire avec WMI. Bien que vous puissiez utiliser WMI pour obtenir des informations sur les objets WMI, vous ne pouvez pas utiliser WMI pour obtenir des informations sur les objets COM (tel que FileSystemObject par exemple). Ce n'est pas le cas avec Windows PowerShell. Get-Member fonctionne avec tout objet que vous pouvez lier ou créer. Vous ne vous souvenez pas des méthodes disponibles lorsque vous utilisez FileSystemObject ? Alors exécutez la commande suivante :

New-Object -comobject "Scripting.     FileSystemObject" | Get-Member

C'est une capacité extrêmement utile - et donc incroyablement sous-utilisée.

Sympathique, n'est-ce pas ? Si nous faisons défiler la liste des propriétés et des méthodes disponibles lorsque nous travaillons avec le fichier C:\Scripts\Test.txt, nous finirons par voir cette ligne :

LastWriteTime             Property       System.DateTime LastWriteTime {get;set;}

Intéressant. Apparemment, LastWriteTime est une propriété qui prend en charge à la fois get (lecture) et set (écriture). Est-ce que cela signifie que nous pouvons utiliser Windows PowerShell pour modifier l'heure de la dernière écriture du fichier ? Sans commentaire....

Glossaire Windows PowerShell

Alias Nom personnalisable qui représente une cmdlet existante. Windows PowerShell propose un nombre d'alias par défaut qui mappent les commandes shell courantes vers leurs équivalents cmdlets.

Cmdlet Unité de fonctionnalité la plus petite dans Windows PowerShell, analogue aux commandes intégrées dans d'autres interpréteurs de commandes.

Commande Unité d'exécution dans Windows PowerShell. Les commandes peuvent comprendre plusieurs opérations canalisées et étendre des lignes à l'aide du caractère ;.

Frappuccino Boisson frappée au café vendue chez Starbucks.

Monad/MSH/Microsoft Command Shell Anciens noms de code pour Windows PowerShell.

Objet Données structurées récupérées dans le système ou dans une commande. Windows PowerShell manipule les données comme des objets .NET, en vous permettant de manipuler les propriétés d'objets par nom plutôt que d'avoir à analyser un résultat de commande de type texte.

Paramètre Les options définissent une cmdlet sur la ligne de commande. Windows PowerShell utilise un trait d'union initial (-) pour désigner un paramètre.

Pipeline Permet d'envoyer la sortie d'une commande vers l'entrée d'une autre commande. Également appelé canal ; représenté par le caractère | dans les commandes.

Profil Paramètres, chargés lorsque Windows PowerShell démarre, qui vous permettent de configurer le fonctionnement de l'interpréteur de commandes.

Script Une ou plusieurs commandes enregistrées sous et exécutées à partir d'un fichier. Windows PowerShell utilise une extension .ps1 pour les fichiers script.

Shell Environnement de ligne de commande dans lequel vous pouvez exécuter à la fois des commandes et des cmdlets.

Variable Objet ou paramètre dont la valeur peut être définie, modifiée ou récupérée pendant l'exécution de commande.

À présent, revenons sur la commande qui définit l'heure de la dernière écriture du Test.txt à la date et à l'heure actuelles. Voici à quoi cela ressemble :

$a = Get-Item c:\scripts\test.txt; $a.LastWriteTime = Date

Comme vous pouvez le voir, cette commande est assez simple. Pour commencer, nous déclarons une variable nommée $a. Ensuite nous utilisons une cmdlet Get-Item pour connexion au fichier C:\Scripts\Test.txt. Ensuite, nous stockons cet objet dans la variable $a. Après avoir entré un point-virgule (qui nous permet d'effectuer plusieurs commandes sur une seule ligne), nous définissons la valeur de la propriété LastWriteTime à la date et à l'heure actuelles. Cela compense presque l'absence de porte-gobelets, n'est-ce pas ?

Allons un peu plus loin...

Évidemment, vous n'êtes pas limité non plus au fait de définir l'heure de la dernière écriture à la date et à l'heure actuelles. Par exemple, observez cette commande :

$b = Get-Date "5/22/2006 8:15 PM";
$a = Get-Item c:\scripts\test.txt; $a.LastWriteTime = $b

Cette fois nous avons chaîné trois commandes. Pour commencer, nous utilisons la cmdlet Get-Date pour créer un objet date-heure égal à 5/22/2006, 8:15 PM. (22/05/2006, 20h15) Pour quelle raison n'avons nous pas eu besoin d'utiliser Get-Date pour créer un objet date-heure dans notre premier script, celui qui définit l'heure de la dernière écriture à la date et à l'heure actuelles ? C'est simple : la commande Date command renvoie automatiquement un objet date-heure. (Pour vérifier ceci par vous-même, entrez la commande suivante dans la console Windows : Date | Get-Member.)

Après avoir créé un objet date-heure égal à la date et à l'heure souhaitées, nous utilisons la commande Get-Item que nous connaissons bien pour obtenir un objet représentant le fichier Test.txt (objet que nous stockons dans la variable $a). Enfin, nous attribuons la valeur représentée par la variable $b à la propriété LastWriteTime.

$a.LastWriteTime = $b

Et que vous le croyiez ou non, vous n'avez pas encore vu la moitié des possibilités. Examinez cette commande qui a l'air complètement inoffensif :

$b = Get-Date "5/22/2006 8:15 PM";
Get-ChildItem c:\scripts | ForEach-Object {$_.LastWriteTime = $b}

Qu'a-t-elle de si intéressant ? Regardons ce qu'elle fait. La première partie est simple : une fois de plus, nous créons un objet date-heure équivalent à 8:15 PM le 5/22/2006 (20 h15 le 22/05/2006). Remarquez cependant que dans la deuxième partie, nous n'utilisons pas la cmdlet Get-Item mais plutôt cette commande :

Get-ChildItem c:\scripts

Quel intérêt y a t-il à cela ? Chaque fois que vous appliquez la cmdlet Get-ChildItem à un dossier, vous obtenez en retour un ensemble de tous les fichiers de ce dossier. Nous allons extraire cet ensemble de fichiers, puis transmettre tous les éléments de l'ensemble via le pipeline (le symbole | apparaît à nouveau) à la cmdlet ForEach-Object.

Et qu'est-ce que ForEach-Object va faire de tous ces fichiers ? Il va modifier la valeur de la propriété LastWriteTime pour chacun d'entre eux, évidemment :

ForEach-Object {$_.LastWriteTime = $b}

Remarque Bien que la rubrique de ce mois-ci ne soit pas supposée être un guide du débutant pour Windows PowerShell, il nous faut remarquer que $_ est une variable spéciale qui représente l'élément dans une boucle For Each. Il est équivalent à objItem dans la boucle VBScript suivante :

For Each objItem in colItems
    Wscript.Echo objItem.Name
Next

Lorsque notre commande Windows PowerShell a terminé son exécution, tous les fichiers dans le dossier C:\Scripts auront la même heure de dernière écriture. Nous aimerions bien voir une de ces calèches ultra-modernes et sans chevaux faire cela !

Nous pourrions exécuter des variations de cette commande toute la nuit. Par exemple, peut-être souhaitez vous modifier l'heure de la dernière écriture des seuls fichiers .txt dans le fichier C:\Scripts ? Bon d'accord, il suffisait juste de demander :

$b = Get-Date "5/22/2006 8:15 PM"; Get-ChildItem c:\scripts\*.txt | ForEach-Object {$_.LastWriteTime = $b}

Aiguiser votre appétit

C'est super. Toutefois, il nous faut remarquer que le but de cette rubrique n'est pas de vous "vendre" Windows PowerShell, ni de vous encourager à rejeter tous vos scripts VBScript et à les convertir en Windows PowerShell. Si ces scripts effectuent ce que voulez et ce que vous avez besoin qu'ils fassent, vous devriez laisser les choses tel que ; il en va de même pour les fichiers traités par lot, les outils à ligne de commande, les correcteurs orthographiques magiques et pour tous les autres outils que vous utilisez pour gérer vos ordinateurs. Rappelez-vous, on ne change pas une équipe qui gagne.....

Le but n'est pas que Windows PowerShell vous permette de faire des choses que vous êtes déjà capables de faire ; le but est que, notamment parce qu'il permet l'accès à .NET Framework, Windows PowerShell vous permet de faire des choses que vous n'avez pas réussi à faire auparavant. Modifier l'heure du dernier accès à un fichier (ou à un groupe de fichiers) en est un exemple. Le fait qu'il y ait ou pas d'autres exemples dépend de ce que vous avez besoin de faire. Ce sont ces capacités qui font que Windows PowerShell mérite qu'on s'intéresse à lui.

Pour beaucoup d'entre vous, cette présentation de Windows PowerShell a été inhabituelle : après tout, au lieu de commencer par un simple exemple du genre "Bonjour tout le monde" nous nous sommes lancés dans une commande Windows PowerShell à plusieurs parties, tout en agitant des termes tels que pipeline et cmdlet comme si tout le monde savait ce que nous entendions par là. C'était volontaire. Après tout, nous savons que beaucoup d'entre vous n'ont pas encore essayé Windows PowerShell ; nous avions peur que si nous vous montrions comment récupérer une liste de services sur un ordinateur, vous vous contenteriez de hausser les épaules et retourneriez à vos occupations.

Remarque Nous espérons que vous n'étiez pas en train de conduire. Pour la beaucoup d'entre nous, c'est déjà assez difficile de boire trois boissons, de regarder un DVD et d'utiliser son téléphone portable tout en conduisant, sans ajouter "la lecture de TechNet Magazine" à la liste.

Allez, ne le prenez pas mal : nous avons bien dit pour beaucoup d'entre nous. Par pour nous tous.

Les Scripteurs de Microsofttravaillent pour - enfin, disons qu'ils sont employés par - Microsoft. Lorsqu'ils ne jouent pas, ne regardent pas un match ou ne coachent pas une équipe de base-ball (voire un autre sport ou activité), ils gèrent le Centre de Script TechNet. Allez vérifier sur www.scriptingguys.com.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.