Chaque jour, les administrateurs système doivent réaliser diverses opérations standard sur les nombreux fichiers et dossiers de leurs serveurs Windows. Ces tâches impliquent souvent de gérer les données des utilisateurs sur des ressources partagées et d’assurer des sauvegardes adéquates. Pour réduire le volume de travail manuel que cela représente, vous pouvez utiliser PowerShell.
Dans cet article, vous allez apprendre à utiliser PowerShell pour :
- Afficher des objets dans un répertoire
- Créer des fichiers et des dossiers
- Supprimer des fichiers et des dossiers
- Copier des fichiers et des dossiers
- Déplacer des fichiers ou des répertoires
- Renommer des fichiers
- Modifier des extensions de fichiers
Avant de commencer, assurez-vous que votre stratégie système vous autorise à exécuter des scripts PowerShell, tel qu’expliqué dans le didacticiel « Tutoriel de Windows PowerShell Scripting pour débutants ».
Afficher des objets dans un répertoire
Pour consulter le contenu d’un répertoire dans un serveur de fichiers Windows, utilisez le cmdlet Get-ChildItem. Pour afficher tous les fichiers cachés, ajoutez le paramètre -Force. La commande ci-dessous affiche tous les objets racines du dossier « Shared » (Partagé).
Get-ChildItem -Force \\fs\Shared
Si vous souhaitez également consulter tous les sous-dossiers et leur contenu, ajoutez le paramètre -Recurse :
Get-ChildItem -Force \\fs\Shared -Recurse
Pour filtrer les résultats, ajoutez les paramètres Filter (Filtrer), Exclude (Exclure), Include (Inclure) et Path (Chemin) au cmdlet Get-ChildItem. Pour un filtrage avancé des objets, utilisez le cmdlet Where-Object. Le script ci-dessous recherche tous les fichiers exécutables dans le dossier IT, qui ont été modifiés après le 1er avril 2018.
Get-ChildItem -Path \\fs\Shared\IT -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt '2018-04-01')}
Créer des fichiers et des dossiers avec PowerShell
Pour créer de nouveaux objets avec Windows PowerShell, vous pouvez utiliser le cmdlet New-Item et spécifier le type d’élément que vous souhaitez créer, par exemple un répertoire, un fichier ou une clé de registre.
Cette commande, par exemple, crée un dossier :
New-Item -Path '\\fs\Shared\NewFolder' -ItemType Directory
Et celle-ci crée un fichier vide :
New-Item -Path '\\fs\Shared\NewFolder\newfile.txt' -ItemType File
Créer des fichiers et y inscrire des données
Il existe au moins deux méthodes intégrées permettant de créer un fichier et d’y inscrire des données. La première consiste à utiliser le cmdlet Out-File :
$text = 'Hello World!' | Out-File $text -FilePath C:\data\text.txt
Pour écraser un fichier existant, utilisez le paramètre switch –Force.
Vous pouvez également créer des fichiers à l’aide du cmdlet Export-Csv, qui exporte le résultat dans un fichier csv pouvant être ouvert dans Excel :
Get-ADuser -Filter * | Export-Csv -Path C:\data\ADusers.csv
Créer des fichiers après avoir vérifié qu’ils n’existaient pas déjà
Le script suivant vérifie si un fichier spécifique (pc.txt) existe déjà dans un dossier particulier. Si le fichier n’existe pas déjà, le script génère une liste de tous les ordinateurs AD et l’enregistre dans un nouveau fichier nommé pc.txt :
#créer une série de fichiers texte $files=Get-ChildItem C:\data\*.txt | select -expand fullname #vérifier si le fichier existe dans la série $files -match "pc.txt" #si la correspondance renvoie « True » (Vrai), quitter, si elle renvoie « False » (Faux), créer un rapport if($files -eq 'False'){ Get-ADComputer -Filter * | Export-Csv -Path C:\data\pc.txt } else{exit}
Supprimer des fichiers et des dossiers avec PowerShell
Pour supprimer des objets, utilisez le cmdlet Remove-Item. Remarquez que vous êtes invité à confirmer lors de l’exécution, si l’objet n’est pas vide. L’exemple ci-dessous montre comment supprimer le dossier IT, tous ses sous-dossiers et les fichiers qu’il contient :
Remove-Item -Path '\\fs\shared\it\' Confirm L’élément à \\pdc\shared\it a des enfants, et le paramètre Recurse n’a pas été spécifié. Si vous continuez, tous les enfants seront supprimés avec l’élément. Êtes-vous sûr de vouloir continuer ? [Y] Oui [A] Oui à tout [N] Non [L] Non à tout [S] Suspendre [?] Aide (le choix par défaut est « Y ») :
Si vous avez déjà vérifié que tous les objets d’un dossier doivent être supprimés, vous pouvez utiliser le switch ?Recurse pour sauter l’étape de confirmation :
Remove-Item -Path '\\fs\shared\it\' -Recurse
Supprimer les fichiers et les dossiers plus anciens que X jours
Vous devez parfois nettoyer les vieux fichiers d’un répertoire particulier. Voici comment accomplir cette tâche :
$Folder = "C:\Backups" #supprimer les fichiers plus anciens que 30 jours Get-ChildItem $Folder -Recurse -Force -ea 0 | ? {!$_.PsIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays(-30)} | ForEach-Object { $_ | del -Force $_.FullName | Out-File C:\log\deletedbackups.txt -Append }
Supprimer des fichiers après avoir vérifié qu’ils existent
Voici comment vérifier qu’un fichier existe, et le supprimer si tel est le cas :
$FileName = 'C:\data\log.txt' If (Test-Path $FileName){ Remove-Item $FileName }
Supprimer des fichiers sur plusieurs ordinateurs avec un seul script
Pour supprimer des fichiers sur des ordinateurs distants, vous devez disposer des autorisations de sécurité permettant d’y accéder. Veillez à utiliser les chemins d’accès UNC, pour que le script détermine correctement l’emplacement des fichiers.
$filelist = @(" \c$\Temp", "\c$\Backups") #variable de suppression des fichiers et du dossier $computerlist = Get-Content C:\data\pc.txt #obtenir la liste des ordinateurs distants foreach ($computer in $computerlist){ foreach ($file in $filelist){ $filepath= Join-Path "\\$computer\" "$filelist" #générer les chemins d’accès unc vers les fichiers et dossiers if (Test-Path $filepath) { Remove-Item $filepath -force -recurse -ErrorAction Continue}}}
Copier des fichiers et des dossiers avec PowerShell
Le cmdlet Copy-Item vous permet de copier des objets d’un chemin d’accès à un autre. La commande suivante crée une sauvegarde en copiant le fichier users.xlsx depuis un ordinateur distant (fs) et en l’enregistrant dans un autre (fs2) via le réseau :
Copy-Item -Path \\fs\Shared\it\users.xlsx -Destination \\fs2\Backups\it\users.xlsx
Si le fichier cible existe déjà, la tentative de copie échouera. Pour écraser le fichier existant, même s’il est en lecture seule, utilisez le paramètre -Force.
Copy-Item -Path \\fs\Shared\it\users.xlsx -Destination \\fs2\Backups\it\users.xlsx -Force
Copier des fichiers avec PowerShell vers ou depuis un ordinateur distant
Si vous copiez des fichiers vers ou depuis des ordinateurs distants, veillez à utiliser les chemins d’accès UNC.
Utilisez par exemple cette commande pour copier des fichiers d’un serveur de fichiers distant dans le répertoire local C: :
Copy-Item \\fs\c$\temp -Recurse C:\data\
Pour copier des fichiers depuis votre répertoire local vers le dossier distant, il suffit d’inverser les emplacements source et destination :
Copy-Item C:\data\ -Recurse \\fs\c$\temp
Copier plusieurs fichiers d’un serveur à un autre via le réseau à l’aide d’un script
Vous pouvez également copier des fichiers d’un serveur distant vers un autre. Le script suivant copie de manière récursive le dossier \\fs\Shared\temp vers \\fs\Shared\test:
Copy-Item \\fs\Shared\temp -Recurse \\fs\Shared\test
Copier certains types de fichiers seulement
Pour ne copier que certains fichiers depuis la source vers la destination, utilisez le paramètre -Filter. Par exemple, la commande suivante ne copie que les fichiers txt d’un dossier à l’autre :
Copy-Item -Filter *.txt -Path \\fs\Shared\it -Recurse -Destination \\fs2\Shared\text
Copier des fichiers à l’aide des commandes XCOPY et ROBOCOPY ou des objets COM
Vous pouvez également exécuter les commandes XCOPY et ROBOCOPY pour copier des fichiers, ou utiliser des objets COM, comme dans l’exemple ci-dessous :
(New-Object -ComObject Scripting.FileSystemObject).CopyFile('\\fs\Shared', 'fs2\Backup')
Déplacer des fichiers et des répertoires avec PowerShell
Le cmdlet Move-Item déplace un élément avec ses propriétés, son contenu et ses éléments enfants, d’un emplacement à un autre. Il peut également déplacer un fichier ou un sous-répertoire depuis un répertoire vers un autre emplacement.
La commande suivante déplace un fichier de sauvegarde spécifique d’un emplacement à un autre :
Move-Item -Path \\fs\Shared\Backups\1.bak -Destination \\fs2\Backups\archive\1.bak
Ce script déplace tout le dossier Backups (Sauvegardes) et son contenu vers un autre emplacement :
Move-Item -Path \\fs\Shared\Backups -Destination \\fs2\Backups\archive
Le répertoire Backups et tous ses fichiers et sous-dossiers apparaîtront alors dans le répertoire archive.
Renommer des fichiers avec Powershell
Le cmdlet Rename-Item vous permet de modifier le nom d’un objet en ne touchant pas à son contenu. Il n’est pas possible de déplacer des éléments avec la commande Rename-Item. Pour cela, vous devez utiliser le cmdlet Move-Item, tel qu’expliqué précédemment.
La commande suivante renomme un fichier :
Rename-Item -Path "\\fs\Shared\temp.txt" -NewName "new_temp.txt"
Renommer plusieurs fichiers
Pour renommer plusieurs fichiers simultanément, utilisez un script comme celui-ci :
$files = Get-ChildItem -Path C:\Temp #create list of files foreach ($file in $files) { $newFileName=$file.Name.Replace("A","B") #replace "A" with "B" Rename-Item $file $newFileName }
Modifier des extensions de fichiers avec PowerShell
Vous pouvez également utiliser Rename-Item pour modifier des extensions de fichiers. Si vous souhaitez modifier les extensions de plusieurs fichiers simultanément, utilisez le cmdlet Rename-Item avec le cmdlet Get-ChildItem.
Le script suivant modifie toutes les extensions de fichiers « txt » en « bak ». Le caractère générique (*) permet d’inclure tous les fichiers texte :
Get-ChildItem \\fs\Shared\Logs\*.txt | Rename-Item -NewName { $_.name -Replace '\.txt$','.bak' }
Conclusion
En vous servant des instructions du présent article, vous pouvez automatiser une variété d’opérations simples relatives à la gestion des fichiers dans vos systèmes de stockage de fichiers, et gagner du temps que vous pourrez consacrer à des tâches plus importantes. Bonne chance !