web-dev-qa-db-fra.com

PowerShell: Stocker le contenu du fichier texte entier dans une variable

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?

98
Nick

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
99
manojlds

En passant, dans PowerShell 3.0, vous pouvez utiliser le Get-Content cmdlet avec le nouveau commutateur Raw:

$text = Get-Content .\file.txt -Raw 
165
Shay Levy

Powershell 2.0:

(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)

Powershell 3+:

$text = Get-Content $filePath -Raw
19
Kapé

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.

13
Michael Sorens

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.

1
Jerry T.