J'aimerais utiliser PowerShell pour stocker le fichier tout le site le contenu d'un fichier texte (y compris la ligne blanche de fin qui peut exister ou non) dans une variable. J'aimerais également connaître le nombre total de lignes du fichier texte. Quelle est la manière la plus efficace de procéder ?
Réponses
Trop de publicités?Pour obtenir le contenu complet d'un fichier :
$content = [IO.File]::ReadAllText(".\test.txt")
Nombre de lignes :
([IO.File]::ReadAllLines(".\test.txt")).length
ou
(gc .\test.ps1).length
C'est une sorte de piratage que d'inclure une ligne vide à la fin :
[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
Powershell 2.0 :
(voir l'explication détaillée ici)
$text = Get-Content $filePath | Out-String
En IO.File.ReadAllText
n'a pas fonctionné pour moi avec un chemin relatif, il cherche le fichier en %USERPROFILE%\$filePath
au lieu du répertoire courant (du moins lorsqu'il est exécuté à partir de Powershell ISE) :
$text = [IO.File]::ReadAllText($filePath)
Powershell 3+ :
$text = Get-Content $filePath -Raw
Une autre approche de la lecture d'un fichier, que j'aime bien, est connue sous le nom de notation des variables o syntaxe des variables et consiste simplement à enfermer un fichier dans des accolades précédées du signe dollar :
$content = ${C:file.txt}
Cette notation peut être utilisée comme une valeur L ou une valeur R ; ainsi, vous pourriez tout aussi bien é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 été fasciné par cette notation au départ parce qu'il était très difficile de trouver quoi que ce soit à son sujet ! Même la spécification PowerShell 2.0 ne la mentionne qu'une seule fois, en montrant une seule ligne qui l'utilise, mais sans aucune explication ni aucun détail sur son utilisation. J'ai ensuite trouvé cet article de blog sur Variables PowerShell qui donne un bon aperçu de la situation.
Une dernière remarque sur l'utilisation de cette fonction : vous devez utiliser une désignation de lecteur, c'est-à-dire ${drive:filespec}
comme je l'ai fait dans tous les exemples ci-dessus. Sans le lecteur (par exemple ${file.txt}
), cela ne fonctionne pas. Il n'y a pas de restrictions sur les spécifications de fichiers sur ce lecteur : elles peuvent être absolues ou relatives.
Get-Content saisit les données et les déverse dans un tableau, ligne par ligne. En supposant qu'il n'y ait pas d'autres exigences particulières que celles que vous avez énumérées, vous pourriez simplement enregistrer votre contenu dans une variable ?
$file = Get-Content c:\file\whatever.txt
Courir juste $file
retournera le contenu complet. Ensuite, vous pouvez simplement faire $file.Count
(car 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 vous aidera ! Je ne suis pas un spécialiste des scripts, mais cela m'a semblé plus facile que beaucoup des trucs ci-dessus.