Gestion des fichiers avec PowerShell

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 :

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 !

Quel outil utilisez-vous pour gérer les fichiers ?

Loading ... Loading ...