Utilisation de fichiers et de dossiers

La navigation dans des lecteurs PowerShell et la manipulation des éléments qu’ils contiennent sont similaires à la manipulation de fichiers et dossiers sur des lecteurs de disques Windows. Cet article explique comment effectuer certaines tâches de manipulation de fichiers et de dossiers à l’aide de PowerShell.

Répertorier tous les fichiers et dossiers figurant dans un dossier

Vous pouvez obtenir tous les éléments figurant directement dans un dossier à l’aide de Get-ChildItem. Pour afficher les fichiers ou éléments système masqués, ajoutez le paramètre facultatif Force. Par exemple, cette commande affiche le contenu direct du lecteur PowerShell C:.

Get-ChildItem -Path C:\ -Force

La commande répertorie uniquement les éléments contenus directement, de manière très similaire à la commande cmd.exe de dir ou à ls dans un interpréteur de commande UNIX. Pour afficher les éléments dans un sous-dossier, vous devez spécifier le paramètre Recurse. La commande suivante répertorie tout ce qui se trouve sur le lecteur C: :

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem peut filtrer les éléments avec ses paramètres Path, Filter, Include et Exclude, mais ceux-ci sont généralement basés uniquement sur le nom. Vous pouvez effectuer un filtrage complexe basé sur d’autres propriétés d’éléments à l’aide de Where-Object.

La commande suivante recherche dans le dossier Program Files tous les exécutables modifiés après le 1er octobre 2005, dont la taille n’est pas inférieure à 1 Mo ou supérieure à 10 Mo :

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

Copie de fichiers et dossiers

La copie s’effectue avec Copy-Item. La commande suivante sauvegarde votre script de profil PowerShell :

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

La commande Test-Path vérifie si le script de profil existe.

Si le fichier de destination existe déjà, la tentative de copie échoue. Pour remplacer une destination existante, utilisez le paramètre Force :

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

Cette commande fonctionne même lorsque la destination est en lecture seule.

La copie de dossier fonctionne de la même manière. Cette commande copie le dossier C:\temp\test1 dans le nouveau dossier C:\temp\DeleteMe de manière récursive :

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Vous pouvez également copier une sélection d’éléments. La commande suivante copie tous les fichiers .txt contenus n’importe où dans C:\data vers C:\temp\text :

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Vous pouvez néanmoins toujours exécuter des commandes natives comme xcopy.exe et robocopy.exe pour copier des fichiers.

Création de fichiers et dossiers

La création de nouveaux éléments fonctionne de la même manière sur tous les fournisseurs PowerShell. Si un fournisseur PowerShell a plus d’un type d’élément (par exemple, le fournisseur FileSystem de PowerShell fait la distinction entre les répertoires et les fichiers), vous devez spécifier le type d’élément.

Cette commande crée un nouveau dossier C:\temp\New Folder :

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

Cette commande crée un nouveau fichier vide C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Important

Lorsque vous utilisez le commutateur Force avec la commande New-Item pour créer un dossier et que le dossier existe déjà, cela n’écrase ou ne remplace pas le dossier. L’objet de dossier existant est simplement retourné. Toutefois, si vous utilisez New-Item -Force sur un fichier qui existe déjà, le fichier est remplacé.

Suppression de tous les fichiers et dossiers figurant dans un dossier

Vous pouvez supprimer des éléments contenus à l’aide de Remove-Item, mais vous devez confirmer la suppression si les éléments contiennent autre chose. Par exemple, si vous tentez de supprimer le dossier C:\temp\DeleteMe contenant d’autres éléments, PowerShell vous invite à confirmer la suppression :

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Si vous ne souhaitez pas être invité à confirmer la suppression de chaque élément contenu, spécifiez le paramètre Recurse:

Remove-Item -Path C:\temp\DeleteMe -Recurse

Mappage d’un dossier local en tant que lecteur

Vous pouvez également mapper un dossier local à l’aide de la commande New-PSDrive. La commande suivante crée un lecteur local P: dans la racine du répertoire Program Files local, visible uniquement à partir de la session PowerShell :

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Comme les lecteurs réseau, les lecteurs mappés à l’intérieur de PowerShell sont immédiatement visibles pour l’interpréteur de commandes PowerShell. Pour créer un lecteur mappé visible à partir de l’Explorateur de fichiers, utilisez le paramètre Persist. Toutefois, seuls les chemins d’accès distants peuvent être utilisés avec Persist.

Lecture d’un fichier texte dans un tableau

L’un des formats de stockage courants pour les données de texte est celui d’un fichier contenant des lignes séparées traitées en tant qu’éléments de données distincts. La cmdlet Get-Content permet de lire un fichier entier en une seule étape, comme illustré ici :

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content traite les données lues à partir du fichier en tant que tableau, avec un élément par ligne de contenu du fichier. Vous pouvez vous en assurer en vérifiant la longueur (longueur) du contenu retourné :

PS> (Get-Content -Path $PROFILE).Length
3

Cette commande est particulièrement utile pour obtenir des listes d’informations directement dans PowerShell. Par exemple, vous pouvez stocker une liste de noms d’ordinateur ou d’adresses IP dans le fichier C:\temp\domainMembers.txt, avec un nom sur chaque ligne du fichier. Vous pouvez utiliser Get-Content pour récupérer le contenu du fichier et le placer dans la variable $Computers :

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers est désormais un tableau contenant un nom d’ordinateur dans chaque élément.