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.