Je souhaite lire un fichier ligne par ligne dans PowerShell. Plus précisément, je souhaite parcourir le fichier, stocker chaque ligne dans une variable de la boucle et effectuer un traitement sur la ligne.
Je connais l'équivalent de Bash:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Pas beaucoup de documentation sur les boucles PowerShell.
Pas beaucoup de documentation sur les boucles PowerShell.
La documentation sur les boucles dans PowerShell est abondante et vous pouvez consulter les rubriques d'aide suivantes: about_For
, about_ForEach
, about_Do
, about_While
.
_foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
_
Une autre solution idiomatique de PowerShell à votre problème consiste à diriger les lignes du fichier texte vers la cmdlet ForEach-Object
:
_Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
_
Au lieu de faire correspondre les expressions rationnelles à l'intérieur de la boucle, vous pouvez diriger les lignes à travers Where-Object
pour filtrer uniquement celles qui vous intéressent:
_Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
_
Get-Content
a de mauvaises performances. il essaie de lire le fichier en mémoire en une fois.
Le lecteur de fichiers C # (.NET) lit chaque ligne une par une
Meilleure Performance
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
Ou légèrement moins performant
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
L'instruction foreach
sera probablement légèrement plus rapide que ForEach-Object
(voir les commentaires ci-dessous pour plus d'informations).
Le commutateur tout-puissant fonctionne bien ici:
'one
two
three' > file
$regex = '^t'
switch -regex -file file {
$regex { "line is $_" }
}
Sortie:
line is two
line is three