PowerShell: stocke des contenus de fichiers texte entiers dans une variable

J’aimerais utiliser PowerShell pour stocker l’ intégralité du contenu d’un fichier texte (y compris la ligne blanche qui peut ou non exister) dans une variable. J’aimerais aussi connaître le nombre total de lignes dans le fichier texte. Quel est le moyen le plus efficace de le faire?

Pour obtenir l’intégralité du contenu d’un fichier:

$content = [IO.File]::ReadAllText(".\test.txt") 

Nombre de lignes:

 ([IO.File]::ReadAllLines(".\test.txt")).length 

ou

 (gc .\test.ps1).length 

Sorte de hackish pour inclure les lignes vides finales:

 [io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count 

Remarque: dans PowerShell 3.0, vous pouvez utiliser l’applet de commande Get-Content avec le nouveau commutateur Raw:

 $text = Get-Content .\file.txt -Raw 

Powershell 2.0:

(voir l’explication détaillée ici)

 $text = Get-Content $filePath | Out-Ssortingng 

Le IO.File.ReadAllText ne fonctionnait pas pour moi avec un chemin relatif, il recherche le fichier dans %USERPROFILE%\$filePath au lieu du répertoire en cours (lors de l’exécution de Powershell ISE au moins):

 $text = [IO.File]::ReadAllText($filePath) 

Powershell 3+:

 $text = Get-Content $filePath -Raw 

Une autre approche de la lecture d’un fichier que j’apprécie est appelée notation de variable ou syntaxe de variable et consiste simplement à inclure une séquence de fichiers entre accolades précédée d’un signe dollar, à savoir:

 $content = ${C:file.txt} 

Cette notation peut être utilisée soit comme valeur L, soit comme valeur R ; ainsi, vous pourriez aussi facilement écrire dans un fichier avec quelque chose comme ceci:

  ${D:\path\to\file.txt} = $content 

Une autre utilisation pratique est que vous pouvez modifier un fichier en place sans fichier temporaire et sans sous-expressions, par exemple:

 ${C:file.txt} = ${C:file.txt} | select -skip 1 

J’ai commencé par être fasciné par cette notation car il était très difficile de trouver quelque chose à ce sujet! Même la spécification PowerShell 2.0 ne le mentionne qu’une seule fois, ne montrant qu’une seule ligne l’utilisant – mais sans aucune explication ni détails d’utilisation. J’ai par la suite trouvé cette entrée de blog sur les variables PowerShell qui donnent de bonnes indications.

Une dernière remarque sur l’utilisation de ceci: vous devez utiliser une désignation de lecteur, par exemple ${drive:filespec} comme je l’ai fait dans tous les exemples ci-dessus. Sans le lecteur (par exemple, ${file.txt} ), cela ne fonctionne pas. Pas de ressortingctions sur les fichiers sur ce disque: cela peut être absolu ou relatif.

Get-Content récupère les données et les vide dans un tableau, ligne par ligne. En supposant qu’il n’y ait pas d’autres exigences spéciales que vous avez énumérées, vous pouvez simplement enregistrer votre contenu dans une variable?

 $file = Get-Content c:\file\whatever.txt 

Exécuter juste $file renverra le contenu complet. Ensuite, vous pouvez simplement faire $file.Count (parce que les tableaux ont déjà une méthode de comptage intégrée) pour obtenir le nombre total de lignes.

J’espère que cela t’aides! Je ne suis pas un génie du script, mais cela me semblait plus facile que beaucoup de choses ci-dessus.