Hé, vous le scripteur !Nos jeux de shell préférés

Les scripteurs Microsoft

Télécharger le code de cet article: HeyScriptingGuy2008_03.exe (150KB)

D'après la Bible, il n'y a pas un moineau qui tombe à terre sans la volonté de Dieu. Attention, les scripteurs ne suggèrent que nous devons abattre tous les moineaux qui passent. (Mais si quelqu'un veut bien s'occuper de ces stupides corbeaux qui crient sur le toit à 7h00 le samedi matin, ça, c'est une autre histoire. [le rédacteur de cet article aime les corbeaux. C'est pourquoi, lorsque nous disons « veut bien s'occuper » nous voulons dire qu'il faut « s'assurer qu'il reste en bonne santé ». -Ed.]). Cependant, il est réconfortant de savoir que si vous tombez à terre, quelqu'un s'en inquiètera et que bien que vous pensiez être petit et insignifiant, quelqu'un quelque part vous observe. [même s'il ne s'agit que d'un rédacteur. -Ed.]

Ce qui est vrai pour les moineaux l'est également pour les scripts d'administration de système. Nous pouvons donc affirmer que dans le monde des scripts, l'attention se porte sur les outils de scripts les plus importants : Windows PowerShellTM, VBScript, WMI, ADSI et même FileSystemObject. Vous comprendrez donc que ces technologies soient sur le devant de la scène. Après tout, elles vous permettent de réaliser de multiples opérations impressionnantes et utiles. Mais cela ne signifie pas qu'elles sont les seules technologies disponibles pour les scripteurs. Loin de là.

Prenez l'objet Shell, par exemple. L'objet Shell peut ne pas être aussi connu et réputé que Windows PowerShell mais il est néanmoins important et très utile.

Il est fort possible que, tôt ou tard, quelqu'un vous demande d'écrire un script d'administration de système qui utilise l'objet Shell. Il se pose alors une question évidente : que peut-on faire exactement avec l'objet Shell ? Ses possibilités sont multiples et vous pouvez réaliser de nombreuses opérations pratiques. Certaines d'entre elles (telles que la gestion des quotas de disque ou l'affichage d'une barre de progression lors de la copie ou le déplacement de fichiers) ont été couvertes dans le Guide du script Microsoft® Windows® 2000 (microsoft.com/technet/scriptcenter/guide). Dans l'article de ce mois-ci, nous allons vous montrer quelques petits trucs et astuces utiles que vous pouvez faire avec l'objet Shell. Des trucs et astuces que vous ne pensiez pas faisables, sans parler de l'utilisation de l'objet Shell.

Changement de la date de dernière modification d'un fichier

Beaucoup d'entre vont probablement lire ce qui précède et se dire « Hé, attendez une seconde ! Vous ne pouvez pas modifier la date de dernière modification d'un fichier à l'aide d'un script ; en tout cas pas à l'aide de VBScript ». Ce à quoi nous ne pouvons répondre qu'une seule chose : quelle drôle d'idée !

Bon, d'accord, nous, les scripteurs, nous vous l'avons probablement dit par le passé, n'est-ce pas ? Eh bien, il s'avère que nous avions tort. Vous êtes sous le choc, n'est-ce pas ? Vous pouvez modifier la date de dernière modification d'un fichier à l'aide de VBScript. Et pour cela, il vous suffit simplement d'utiliser l'objet Shell.

Remarque : Ne me demandez pas comment les scripteurs ont pu faire une telle erreur. Après toutes ces années, cela devrait être assez évident. Ce qui est beaucoup plus intéressant, c'est la question suivante : Comment avons-nous réussi à faire fonctionner quoi que ce soit ?

Disons que vous souhaitez modifier la date de dernière modification d'un fichier. Il vous suffit d'ajouter ce script :

Set objShell = _
  CreateObject("Shell.Application")

Set objFolder = _
  objShell.NameSpace("C:\Scripts")
Set objFolderItem = _
  objFolder.ParseName("Dr_Scripto.jpg")

objFolderItem.ModifyDate = _
  "01/01/2008 8:00:00 AM"

Comme vous pouvez le voir, ce n'est pas vraiment compliqué. Nous commençons par créer une instance de l'objet Shell.Application. (Au fait, ne confondez pas Shell.Application avec Wscript.Shell, l'objet Shell de l'environnement d'exécution de scripts WSH (Windows Script Host). L'objet Shell avec lequel nous travaillons aujourd'hui est l'objet Shell Windows). Une fois que notre instance de l'objet Shell s'exécute, nous utilisons la méthode d'espace de noms pour le lier au dossier C:\Scripts, puis utilisons la méthode appelée ParseName pour le lier à un fichier spécifié dans ce dossier. Dans ce cas, nous le lions à une image JPEG portant le nom de fichier Dr_Scripto. jpg :

Set objFolderItem = _
  objFolder.ParseName("Dr_Scripto.jpg")

Que devons-nous faire après avoir lié le fichier ? C'est très simple : il nous suffit d'attribuer une nouvelle date et une nouvelle heure à la propriété ModifyDate :

objFolderItem.ModifyDate = _
  "01/01/2008 8:00:00 AM"

C'est tout ce que nous avons à faire.

Vous savez, vous avez raison. C'est cool, non ? Une fois que nous exécutons le script, la date de dernière modification sera définie sur le 1 janvier 2008 à 8h00. (Si vous le souhaitez, vous pouvez vérifier par vous-même en ouvrant le dossier C:\Scripts dans l'Explorateur Windows.)

Bien sûr, certains d'entre vous vont s'écrier « Génial ! Je peux modifier la date de dernière modification d'un fichier. Mais au fait, pourquoi voudrais-je modifier la date de dernière modification d'un fichier ? » Très souvent, les gens utilisent la date de dernière modification d'un fichier comme système de contrôle de version ; lorsque vous disposez de plusieurs copies d'un même script par exemple. Un des moyens de suivre la version officielle consiste à vérifier la date de dernière modification. En vérifiant la date de dernière modification, vous savez si une copie particulière de ce script est une version non modifiée par rapport au script original.

Remarque : Bien sûr, quelqu'un peut exécuter le script que nous venons de vous montrer et changer la date de dernière modification date. À moins d'apposer une signature de code sur tout ce que vous faites, quelqu'un peut toujours trouver un moyen d'être plus malin que le système. Supposons que vous avez des collègues de confiance avec qui vous partagez des scripts, cette approche est raisonnable.

À un moment donné, vous décidez de mettre à jour (et standardiser) la date de dernière modification de tous vos scripts. Comment faire ? En supposant que tous vos scripts se trouvent dans le dossier C:\Scripts, il vous suffit simplement d'exécuter le code suivant :

Set objShell = _
  CreateObject("Shell.Application")

Set objFolder = _
  objShell.NameSpace("C:\Scripts")
Set colItems = objFolder.Items

For Each objItem In colItems
    objItem.ModifyDate  = _
      "01/01/2008 8:00:00 AM"
Next

Comme vous pouvez le voir, le début de ce script ressemble beaucoup au premier script que nous vous avons montré. Cependant, dans ce cas, après l'avoir lié au dossier C:\Scripts, nous n'utilisons pas la méthode ParseName pour le lier à un fichier individuel dans ce dossier. Nous utilisons à la place la ligne de code suivante afin de renvoyer une collection de tous les fichiers trouvés dans ce dossier :

Set colItems = objFolder.Items

Une fois que nous avons notre collection, nous définissons une boucle For Each qui parcourra tous les éléments de cette collection. Dans la boucle For Each, nous utilisons cette ligne de code pratique pour modifier la valeur de la propriété ModifyDate du premier fichier dans la collection en 1 janvier 2008 à 8h00 :

objItem.ModifyDate  = _
  "01/01/2008 8:00:00 AM"

Ensuite, il nous suffit d'utiliser la boucle et de répéter le processus avec le fichier suivant dans la collection. Lorsque tout est terminé, tous les fichiers du dossier C:\Scripts (à l'exception de tous les fichiers masqués) auront la même date de dernière modification. C'est pas beau, ça ? Maintenant, qui a dit qu'il était impossible de modifier la date de dernière modification d'un fichier à l'aide de VBScript ?

D'accord.

En parlant d'erreurs...

Il y a de cela très longtemps, lorsque les scripteurs ont commencé à travailler sur les scripts d'administration de système, il était impossible d'accéder à toutes les informations de fichiers étendus liés à un fichier dans le système de fichiers NTFS. Par exemple, si vous cliquez avec le bouton droit de la souris sur un fichier .wav, puis cliquez sur Propriétés, vous verrez des informations similaires à celles de la figure 1.

Figure 1 Récapitulatif des propriétés du fichier

Figure 1** Récapitulatif des propriétés du fichier **

Comment récupérer des valeurs telles que le taux de transmission ou la taille de l'échantillon audio à l'aide d'un script ? Vous ne pouvez pas, à moins d'utiliser l'objet Shell. (Ou Windows Desktop Search 3.0 en supposant que vous avez téléchargé et installé ce logiciel.) En cours de route, la capacité à récupérer toutes les informations de propriété étendues pour un fichier a été ajoutée à l'objet Shell, mais les scripteurs l'ont négligée. Par conséquent, nous avons dit aux gens « Vous ne pouvez pas utiliser un script pour déterminer la vitesse de transmission d'un fichier .wav. » bien que ce soit possible, comme l'indique le code à la figure 2.

Figure 2 Utilisez un script pour rechercher la vitesse de transmission d'un fichier .wav

Set objShell = CreateObject("Shell.Application")

Set objFolder = objShell.NameSpace("C:\Scripts")
Set objFolderItem = objFolder.ParseName("J0388563.wav")

For i = 0 to 33
    strHeader = objFolder.GetDetailsOf(objFolder.Items, i)
    strValue = objFolder.GetDetailsOf(objFolderItem, i)
    If strValue <> "" Then
        Wscript.Echo strHeader & vbTab & strValue
    End If
Next

Comment ce script fonctionne-t-il ? Ce script commence exactement comme le premier script que nous vous avons montré : Nous créons une instance de l'objet Shell.Application et nous le lions au dossier C:\Scripts. Nous utilisons ensuite la méthode ParseName pour lier le fichier en question (dans ce cas, J0388563.wav).

À ce stade, le processus se complique un peu. Pour commencer, nous définissons une boucle For Next qui s'exécute entre 0 et 33 parce que les fichiers prennent en charge jusqu'à 31 propriétés étendues différentes ayant reçues les numéros d'index 0 à 33. (Notez qu'il y a quelques numéros, tels que 27 et 28, qui correspondent à des numéros d'index valides mais ne contiennent pas de valeurs de propriété.) En fait, les fichiers prennent en charge les propriétés affichées à la figure 3.

Figure 3 Propriétés du fichier

Index Propriété
0 Nom
1 Taille
2 Type
3 Date de modification
4 Date de création
5 Date d'accès
6 Attributs
7 État
8 Propriétaire
9 Auteur
10 Titre
11 Sujet
12 Catégorie
13 Pages
14 Commentaires
15 Copyright
16 Artiste
17 Titre d'album
18 Année
19 Numéro de piste
20 Genre
21 Durée
22 Vitesse de transmission
23 Protégé
24 Modèle d'appareil photo
25 Date de capture de l'image
26 Dimensions
29 Nom de l'épisode
30 Description du programme
32 Taille de l'échantillon audio
33 Taux de l'échantillon audio

Par conséquent, quelle est la procédure à suivre dans la boucle For Next ? Tout d'abord, nous devons exécuter la ligne de code suivante :

strHeader = _
  objFolder.GetDetailsOf(objFolder.Items, i)

Nous récupérons ici le nom de la propriété 0 à l'aide de la méthode GetDetailsOf (gardez à l'esprit que notre boucle s'exécute de 0 à 33). Nous enregistrons ensuite ce nom dans une variable appelée strHeader et nous utilisons cette ligne de code pour récupérer la valeur de propriété de l'élément 0, en enregistrant les informations renvoyées dans une variable appelée strValue :

strValue = _
  objFolder.GetDetailsOf(objFolderItem, i)

Vous souhaitez voir comme cela fonctionne ? L'élément 0 correspond en fait à la propriété Name. Par conséquent, lors de son premier passage dans la boucle, strHeader équivaudra à Name. Simultanément, le véritable nom (c'est-à-dire la valeur de la propriété Name) pour le premier fichier est J0388563.wav. Par conséquent, lors de son premier passage dans la boucle, strValue équivaudra à J0388563.wav. Lorsque nous l'expliquons ainsi, la procédure n'a pas l'air si compliqué que cela, n'est-ce pas ?

Comme vous le savez probablement, tous les types de fichiers ne prennent pas en charge toutes les propriétés étendues. (Par exemple, un fichier .jpg ne disposera pas d'un titre d'album ou d'un taux de l'échantillon audio). Par conséquent, dans la ligne de code suivante, nous allons vérifier si la valeur renvoyée correspond à une chaîne vide :

If strValue <> "" Then

Si la valeur est une chaîne vide, il nous suffit alors de revenir en haut de la boucle et de répéter le processus avec la propriété étendue suivante. Si la valeur n'est pas une chaîne vide, nous renvoyons le nom de propriété et la valeur :

Wscript.Echo strHeader & vbTab & strValue

Le résultat ? Quelque chose qui ressemble à ce qui suit :

Name    j0388563.wav
Size    169 KB
Type    Wave Sound
Date Modified   1/19/2004 8:56 AM
Date Created    3/6/2006 2:02 PM
Date Accessed   12/3/2007 10:41 AM
Attributes      A
Status  Online
Owner   FABRIKAM\kenmyer
Bit Rate        90kbps
Audio Sample Size       4 bit
Audio Sample Rate       11 kHz

Cool, non ?

Nous manquons de temps (et d'espace) ici, mais si vous cherchez une façon plus facile pour renvoyer les valeurs de propriété les plus pertinentes, essayez plutôt le script à la Figure 4.

Figure 4 Une manière facile de renvoyer les valeurs de propriété

Const colInfoTip = -1

Set objShell = CreateObject("Shell.Application")

Set objFolder = objShell.NameSpace("C:\Scripts")
Set objFolderItem = _
  objFolder.ParseName("01. Out On The Weekend (Album Version).wma)")

Wscript.Echo objFolder.GetDetailsOf(objFolderItem, colInfoTip)

Que fait ce script ? Si vous êtes dans l'Explorateur Windows et que vous maintenez le pointeur de la souris sur un fichier, une info-bulle apparaîtra et vous fournira quelques informations utiles sur le fichier, telles que les informations affichées à la figure 5. Comment pouvez-vous obtenir les informations de l'info-bulle à l'aide d'un script ? C'est exact ! Utilisez le script que nous venons de vous montrer :

Figure 5 Propriétés affichées dans une info-bulle

Figure 5** Propriétés affichées dans une info-bulle **

Artist: Neil Young
Album Title: Harvest
Year: 1972
Track Number: 1
Duration: 0:04:35
Type: Windows Media Audio file
Bit Rate: 256kbps
Protected: Yes
Size: 5.31 MB 

Voilà tout ce que nous avons le temps de vous montrer ce mois-ci. Encore une petite remarque concernant les moineaux. Une des raisons pour laquelle vous souhaiteriez être attentif aux moineaux : Dans certaines parties du monde, l'entrée d'un moineau dans votre maison est un signe de mauvaise augure. Pourquoi ? Parce que cela signifie qu'un habitant de cette maison va mourir. (Dans certains cas, ceci n'est vrai que si le moineau atterrit sur un piano. Mais là, il ne s'agit plus d'une superstition, mais uniquement d'une bizarrerie.) Par contre, ce qui suit risque de vous intéresser : Dans d'autres parties du monde, l'entrée d'un moineau dans votre maison signifie qu'un habitant de cette maison va se marier. Vous avez donc le choix entre un choc et un coup de marteau !

Les scripts embrouillés du Dr. Scripto

Le défi mensuel qui teste non seulement vos compétences en matière d'énigmes, mais également vos compétences en matière de scripts.

Mars 2008 : Script énigmatique

L'énigme de ce mois-ci est un cryptogramme, signifiant que chaque lettre a été remplacée par une lettre différente. (Nous avons laissé tous les symboles et les numéros intacts). La même lettre représente toujours la même lettre remplacée. Par exemple, tous les événements de la lettre A auront peut-être été remplacés par la lettre B, tous les événements de la lettre B auront peut-être été remplacés la lettre Z, et ainsi de suite. Voici un exemple simple :

tdsjqu dfoufs

Décodage :

script center

Dans ce cas, pour décoder l'énigme, il suffit de remplacer chaque lettre par la lettre de l'alphabet qui la précède. Ainsi, la lettre T a été remplacée par S, la lettre D a été remplacée par C, et ainsi de suite.

L'énigme est un peu plus aléatoire que cela. Décodez ce script et vous aurez un script qui ouvre une instance de Microsoft Excel®, ajoute une nouvelle feuille de calcul, attribue quatre valeurs à la première colonne dans la feuille de calcul et trie les données de cette colonne en ordre croissant.

Amusez-vous bien !

Énigme

kqyjs edfjkzyrlyg = 1
kqyjs edyq = 2
kqyjs edjqtstqmj = 2

jzs quwzekzd = ktzfszquwzks("zekzd.faadlkfslqy")
quwzekzd.iljludz = stcz

jzs quwmqtxuqqx = quwzekzd.mqtxuqqxj.frr
jzs quwmqtxjozzs = quwmqtxuqqx.mqtxjozzsj(1)

quwmqtxjozzs.kzddj(1, 1) = "kfs"
quwmqtxjozzs.kzddj(1, 2) = "rqg"
quwmqtxjozzs.kzddj(1, 3) = "ufs"
quwmqtxjozzs.kzddj(1, 4) = "faz"

jzs quwtfygz = quwzekzd.fkslizkzdd.zysltztqm
quwtfygz.jqts quwtfygz, edfjkzyrlyg, , , , , , edyq, , , edjqtstqmj

ANSWER:

Les scripts embrouillés du Dr. Scripto

Réponse : Script cryptique, mars 2008

Voici comment décoder le script :

Actual Letter   a   b   c   d   e   f   g   h   i   j   k
Coded Letter    f   u   k   r   z   b   g   o   l   w   x

Actual Letter   l   m   n   o   p   q   r   s   t   u   v   w   x   y   z
Coded Letter    d   n   y   q   a   h   t   j   s   c   i   m   e   v   p

Et voici le script décodé :

Const xlAscending = 1
Const xlNo = 2
Const xlSortRows = 2

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(1, 1) = "Cat"
objWorksheet.Cells(1, 2) = "Dog"
objWorksheet.Cells(1, 3) = "Bat"
objWorksheet.Cells(1, 4) = "Ape"

Set objRange = objExcel.ActiveCell.EntireRow
objRange.Sort objRange, xlAscending, , , , , , xlNo, , , xlSortRows

Les scripteurs Microsoft Les scripteurs travaillent pour (disons plutôt sont employés par) Microsoft. Lorsqu’ils ne sont pas en train de jouer au base-ball, d’entraîner une équipe ou de regarder un match (ou de se livrer à de multiples autres activités), ils dirigent le Script Center TechNet. Vous pouvez le vérifier vous-même 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.