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

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

Ответ 1

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

$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

Ответ 2

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

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

Ответ 3

Powershell 2.0:

(см. подробное объяснение здесь)

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

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

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

Powershell 3 +:

$text = Get-Content $filePath -Raw

Ответ 4

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

$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}) он не работает. Никаких ограничений на файл данных на этом диске: он может быть абсолютным или относительным.

Ответ 5

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

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

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

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