PowerShell: хранить все содержимое текстового файла в переменной



Я хотел бы использовать PowerShell для хранения всего содержимое текстового файла (включая конечную пустую строку, которая может существовать или не существовать) в переменной. Я также хотел бы знать общее количество строк в текстовом файле. Каков наиболее эффективный способ сделать это?

532   5  

5 ответов:

чтобы получить все содержимое файла:

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

число строк:

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

или

(gc .\test.ps1).length

своего рода хакерский, чтобы включить конечную пустую строку:

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

на стороне записки, в PowerShell 3.0 вы можете использовать Get-Content командлет с новым необработанным переключателем:

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

Powershell 2.0:

(подробное описание здесь)

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

The IO.File.ReadAllText не работает для меня с относительным путем, он ищет файл в %USERPROFILE%$filePath вместо текущего каталога (при запуске из PowerShell ISE по крайней мере):

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

Powershell 3+:

$text = Get-Content $filePath -Raw

еще один подход к чтению файла, который мне нравится, называется по-разному переменной нотации или переменной синтаксис и включает в себя просто заключая filespec в фигурные скобки, предшествующие знак доллара, а именно:

$content = ${C:file.txt}

это обозначение может быть использовано как L-значение или R-значение; таким образом, вы можете так же легко записать в файл что-то вроде этого:

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

еще одно удобное использование заключается в том, что вы можете изменить файл на месте без временного файла и без вложенных выражений, например:

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

Я был очарован этой нотацией изначально, потому что было очень трудно узнать что-нибудь об этом! Даже спецификация PowerShell 2.0 упоминает об этом только один раз, показывая только одну строку, используя ее, но без объяснения или подробностей использования вообще. Позже я нашел эту запись в блоге на переменные PowerShell это дает некоторые хорошие интуиция.

последнее замечание по использованию этого: вы должны использовать обозначение привода, т. е. ${drive:filespec} как я делал во всех приведенных выше примерах. Без привода (например,${file.txt}) он не работает. Никаких ограничений на filespec на этом диске: он может быть абсолютным или относительным.

Get-Content захватывает данные и сбрасывает их в массив, строка за строкой. Предполагая, что нет других специальных требований, чем вы указали, вы можете просто сохранить свой контент в переменную?

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

работает только $file вернет полное содержимое. Тогда вы можете просто сделать $file.Count (потому что массивы уже имеют встроенный метод подсчета), чтобы получить общее количество строк.

надеюсь, что это помогает! Я не сценарист wiz, но это казалось мне проще, чем многие вещи выше.

Comments

    Ничего не найдено.