J'aimerais utiliser PowerShell pour stocker le contenu entier d'un fichier texte (y compris la dernière ligne vierge 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 le contenu entier 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 la dernière ligne vide:
[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
En passant, dans PowerShell 3.0, vous pouvez utiliser le Get-Content
cmdlet avec le nouveau commutateur Raw:
$text = Get-Content .\file.txt -Raw
(voir l'explication détaillée ici)
$text = Get-Content $filePath | Out-String
Le IO.File.ReadAllText
ne fonctionne pas pour moi avec un chemin relatif, il recherche le fichier dans %USERPROFILE%\$filePath
au lieu du répertoire actuel (lorsque vous exécutez au moins Powershell ISE):
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
Une autre approche de la lecture d’un fichier qui me plait est désignée de différentes manières par notation variable ou syntaxe de variable et implique simplement de placer une spécification de fichier entre accolades précédées d'un signe dollar, à savoir:
$content = ${C:file.txt}
Cette notation peut être utilisée sous la forme valeur L ou valeur R ; ainsi, vous pourriez tout 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 sur place sans fichier temporaire ni sous-expressions, par exemple:
${C:file.txt} = ${C:file.txt} | select -skip 1
Cette notation m'a d'abord fasciné car il était très difficile de trouver quoi que ce soit à ce sujet! Même la spécification PowerShell 2.0 le mentionne une seule fois, mais sans explication ni détail d'utilisation. J'ai par la suite trouvé cette entrée de blog sur variables PowerShell qui donne de bonnes informations.
Une dernière remarque sur l’utilisation de ceci: vous devez utiliser une désignation de lecteur, c.-à-d. ${drive:filespec}
comme je l’ai fait dans tous les exemples ci-dessus. Sans le lecteur (par exemple, ${file.txt}
) ça ne marche pas. Aucune restriction sur la spécification de fichier sur ce lecteur: il 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 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 t'aides! Je ne suis pas un expert en script, mais cela me semblait plus facile que beaucoup de choses ci-dessus.