Hey, Scripting Guy!

Comment puis-je remplacer un fichier local par une version plus récente trouvée sur un serveur de fichiers ?

Hey, Scripting Guy!

Bienvenue dans la rubrique TechNet dans laquelle les Microsoft Scripting Guys répondent aux questions fréquentes sur les scripts d'administration de système. Vous avez une question sur les scripts d'administration de système ? Envoyez-la par courrier électronique à scripter@microsoft.com. Nous ne pouvons pas garantir que nous pourrons répondre à toutes les questions qui nous parviendrons, mais nous vous promettons de faire tout notre possible.

Et pensez à consulter les archives Hey, Scripting Guy!.

La question du jour : comment puis-je comparer la date de modification du fichier local avec son homologue sur un serveur de fichiers et, si le fichier local est plus ancien, le remplacer par la version du serveur de fichiers ?

Comment puis-je remplacer un fichier local par une version plus récente trouvée sur un serveur de fichiers ?Comment puis-je remplacer un fichier local par une version plus récente trouvée sur un serveur de fichiers ?

Hey, Scripting Guy! Comment puis-je comparer la date de modification du fichier local avec son homologue sur un serveur de fichiers et, si le fichier local est plus ancien, le remplacer par la version du serveur de fichiers ?

-- DC

Bonjour DC. Voyons, vous souhaitez remplacer quelque chose d'ancien par quelque chose de nouveau. Je ne sais pour quelle raison cela me donne le frisson.

Non pas parce que les membres de Scripting Guys sont vieux, ce n'est pas le cas. Après tout, les articulations sont censées craquer ; sinon, comment saurions-nous qu'elles fonctionnent ?

Remarque. Selon la légende, lorsque les Eskimos deviennent vieux et inutiles, ils sont abandonnés sur un morceau de glace flottante et sont livrés à eux-mêmes. Aucun membre de Scripting Guys n'est Eskimo, mais nous avons tous tendance à porter des manteaux, des gants et des cagoules pour travailler, même l'été. Au cas où.

Mais votre préoccupation concerne probablement davantage les fichiers périmés que les membres de Scripting Guys, n'est-ce pas ? Voici un script qui remplace le fichier local C:\Scripts\Test.txt si ce fichier est plus ancien que son homologue sur le serveur atl-fs-01 :

Const OverwriteExisting = TRUE

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objLocalFile = objFSO.GetFile("c:\scripts\test.txt")
dtmLocalDate = objLocalFile.DateLastModified

Set objServerFile = objFSO.GetFile("\\atl-fs-01\public\test.txt")
dtmServerDate = objServerFile.DateLastModified

If dtmLocalDate < dtmServerDate Then
    objFSO.CopyFile objServerFile.Path, objLocalFile.Path, OverwriteExisting
End If

Comme vous pouvez le voir, ce script est très simple. Reconnaissons que la facilité avec laquelle il est possible de se débarrasser des choses anciennes nous préoccupe quand même. Nous commençons par créer une constante nommée OverwriteExisting et nous lui affectons la valeur True ; nous utiliserons cette constante pour indiquer à FileSystemObject qu'il peut remplacer une instance existante de notre fichier cible. Par défaut, FileSystemObject ne copie pas un fichier du lecteur 1 vers le lecteur 2 si ce fichier existe déjà sur le lecteur 2.

À propos de FileSystemObject, nous créons une instance de cet objet (Scripting.FileSystemObject) à la ligne suivante du script. Nous utilisons ensuite ces deux lignes de code pour la liaison au premier fichier (C:\Scripts\Test.txt) et nous stockons la date de dernière modification du fichier (propriété DateLastModified) dans une variable nommée dtmLocalDate:

Set objLocalFile = objFSO.GetFile("c:\scripts\test.txt")
dtmLocalDate = objLocalFile.DateLastModified

Nous répétons ensuite ce processus en créant une référence objet à la version serveur de Test.txt. Notez que nous utilisons un nom de variable différent ici : la référence objet au fichier local est stockée dans objLocalFile et la référence objet au fichier serveur est stockée dans objServerFile. Inutile de préciser que nous utilisons également une variable différente (dtmServerDate) pour stocker la date de dernière modification :

Set objServerFile = objFSO.GetFile("\\atl-fs-01\public\test.txt")
dtmServerDate = objServerFile.DateLastModified

Vous nous suivez toujours ? Nous devons ensuite déterminer si le fichier local est plus ancien que le fichier sur le serveur. C'est le rôle de cette ligne de code :

If dtmLocalDate < dtmServerDate Then

Ne vous laissez pas surprendre par la syntaxe. Il est facile de supposer que le fichier plus ancien présente une date supérieure à celle du fichier plus récent. Mais ce n'est pas comme cela que fonctionnent les dates. Supposons que le fichier A présente la date de modification 2/1/2006 et que le fichier B présente la date de modification 2/15/2006. Le fichier A est plus ancien, ce qui veut dire que sa date de modification est inférieure à (c'est-à-dire est antérieure à) celle du fichier B.

Supposons donc que notre fichier local soit plus ancien que son homologue sur le serveur. Comment remplacer le fichier local par la copie trouvée sur le serveur ? Voici comment procéder :

objFSO.CopyFile objServerFile.Path, objLocalFile.Path, OverwriteExisting

Comme vous pouvez le voir, il suffit d'appeler la méthode CopyFile et de lui passer trois paramètres :

  • Le chemin du fichier que nous souhaitons copier (c'est-à-dire la version de Test.txt trouvée sur le serveur).

  • Le chemin où nous souhaitons copier ce fichier. Dans ce cas, il s'agit du chemin vers le fichier local.

  • La constante OverwriteExisting, qui indique au script de poursuivre et de remplacer le fichier local par la version copiée depuis le serveur.

Et voilà. Rappelez-vous cependant que ce script ne fonctionne qu'avec les anciens fichiers. Vous ne pouvez pas l'utiliser pour remplacer, par exemple, les anciens membres de Scripting Guys. Même si bien sûr, personne n'a jamais rêvé de remplacer les membres de Scripting Guys. C'est seulement au cas où…

Pour en savoir plus

Consultez les archives de Hey, Scripting Guy!