PowerShell: Speichern Sie den gesamten Inhalt der Textdatei in einer Variablen

118

Ich möchte PowerShell verwenden, um den gesamten Inhalt einer Textdatei (einschließlich der nachfolgenden Leerzeile, die möglicherweise vorhanden ist oder nicht) in einer Variablen zu speichern . Ich möchte auch die Gesamtzahl der Zeilen in der Textdatei wissen. Was ist der effizienteste Weg, dies zu tun?

Nick
quelle

Antworten:

122

So erhalten Sie den gesamten Inhalt einer Datei:

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

Anzahl der Zeilen:

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

oder

(gc .\test.ps1).length

Eine Art Hackish, um nachgestellte Leerzeilen einzuschließen:

[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
Manojlds
quelle
1
Vielen Dank! $content = [IO.File]::ReadAllText(".\test.txt")scheint das Gleiche zu tun wie $content = (gc ".\test.txt" | out-string). Da der zweite der beiden kürzer ist, bevorzuge ich das. Leider berücksichtigt keine der von Ihnen angegebenen Methoden zur Berechnung der Gesamtzahl der Zeilen nachgestellte Leerzeilen. Irgendwelche anderen Ideen?
Nick
@Nick In .Net (und Windows) wird jede Zeile mit \r\ngezählt.
Manojlds
Ich habe ein bisschen experimentiert und mir das Gleiche ausgedacht wie Ihre aktualisierte Antwort, aber ohne Ihre Hilfe wäre ich nicht dorthin gekommen. Vielen Dank!
Nick
Gibt es eine Möglichkeit, dies transparent zu kombinieren Invoke-WebRequest?
Kareem
188

Get-ContentNebenbei bemerkt können Sie in PowerShell 3.0 das Cmdlet mit dem neuen Raw-Schalter verwenden:

$text = Get-Content .\file.txt -Raw 
Shay Levy
quelle
3
Dies sollte die akzeptierte Antwort sein. Ich bin mir übrigens ziemlich sicher, dass Get-Content auch in früheren Versionen funktioniert hat.
MatteoSp
10
@MatteoSp Get-Contenttat es, aber es war nicht bis 3.0, dass es bekam -Raw. Ohne das wird es als Array von Zeilen gespeichert.
jpmc26
Dies sollte unbedingt die akzeptierte Antwort sein. Es hilft nicht, dass die Dokumentation besagt, dass der -RawParameter von nichts Nativem implementiert wird.
Richard Szalay
Danke, das war gerade eine große Hilfe.
DAhrens
24

Powershell 2.0:

(siehe ausführliche Erklärung hier)

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

Das IO.File.ReadAllTexthat bei mir mit einem relativen Pfad nicht funktioniert, es sucht nach der Datei %USERPROFILE%\$filePathanstelle des aktuellen Verzeichnisses (zumindest wenn es von Powershell ISE ausgeführt wird):

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

Powershell 3+:

$text = Get-Content $filePath -Raw
Kapé
quelle
Um Verwandte Pfade zu verwenden, lösen Sie es zuerst, zB:[IO.File]::ReadAllText((Resolve-Path $filePath))
mvanle
13

Ein weiterer Ansatz zum Lesen einer Datei, den ich zufällig mag, wird verschiedentlich als Variablennotation oder Variablensyntax bezeichnet und umfasst einfach das Einschließen einer Dateispezifikation in geschweifte Klammern, denen ein Dollarzeichen vorangestellt ist:

$content = ${C:file.txt}

Diese Notation kann entweder als L-Wert oder als R-Wert verwendet werden . Sie können also genauso gut in eine Datei mit folgendem Inhalt schreiben:

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

Eine weitere praktische Verwendung besteht darin, dass Sie eine Datei ohne temporäre Datei und ohne Unterausdrücke ändern können, zum Beispiel:

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

Diese Notation hat mich anfangs fasziniert, weil es sehr schwierig war, etwas darüber herauszufinden! Selbst in der PowerShell 2.0-Spezifikation wird nur einmal erwähnt, dass nur eine Zeile verwendet wird - jedoch ohne Erklärung oder Einzelheiten zur Verwendung. Ich habe später diesen Blogeintrag zu PowerShell-Variablen gefunden , der einige gute Einblicke gibt.

Ein letzter Hinweis zur Verwendung: Sie müssen eine Laufwerksbezeichnung verwenden, dh ${drive:filespec}wie ich es in allen obigen Beispielen getan habe. Ohne das Laufwerk (zB ${file.txt}) funktioniert es nicht. Keine Einschränkungen für die Dateispezifikation auf diesem Laufwerk: Sie kann absolut oder relativ sein.

Michael Sorens
quelle
Ich habe dies nie zum Laufen gebracht, es sei denn, ich setze einen Backslash nach dem Laufwerksnamen.
Charles Anderson
@CharlesAnderson: Es ist nicht klar, auf welches der drei Beispiele Sie sich beziehen, oder vielleicht auf alle ... Trotzdem habe ich nur bestätigt, dass alle drei in PowerShell V3 mit einem relativen Pfad (dh ohne Backslash) arbeiten. Außerdem habe ich zum Zeitpunkt meiner Antwort V2 verwendet, sodass möglicherweise noch etwas in Ihrer Umgebung ein Problem verursacht.
Michael Sorens
Ich meinte Beispiele wie $ {C: file.txt}, die ich als $ {C: \ file.txt} schreiben muss. Ja, ich nehme an, es geht um meine Umgebung, aber ich habe keine Ahnung, was.
Charles Anderson
Bei Verwendung als L-Wert wird die Standardcodierung des Systems verwendet. Ich habe versucht, $ OutputEncoding ohne Wirkung festzulegen. Bei Verwendung als R-Wert wird ein Array string [] erzeugt.
Robert4
Es scheint, dass Sie nur einen wörtlichen Pfadnamen verwenden können. Sie können darin keine Variable oder so etwas wie einen Join-Path-Ausdruck verwenden. Was ärgerlich ist, denn wenn es über ConvertTo-Json geleitet wird, gibt es einen großen Unterschied zu Get-Content (und das Ergebnis von $ {...} ist das, was ich mir erhofft habe. Ich bin mir nicht sicher, ob dies dasselbe ist als Get-Content | Out-String obwohl
Cameron Kerr
2

Get-Content erfasst Daten und speichert sie zeilenweise in einem Array. Angenommen, es gibt keine anderen speziellen Anforderungen als die von Ihnen aufgelisteten, könnten Sie Ihren Inhalt einfach in einer Variablen speichern?

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

Wenn Sie nur ausführen, $filewird der gesamte Inhalt zurückgegeben. Dann können Sie einfach $file.Count(da in Arrays bereits eine Zählmethode integriert ist) die Gesamtzahl der Zeilen ermitteln.

Hoffe das hilft! Ich bin kein Skript-Assistent, aber das schien mir einfacher zu sein als viele der oben genannten Dinge.

Jerry T.
quelle