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

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


person Nick    schedule 02.11.2011    source источник


Ответы (5)


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

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

Количество строк:

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

or

(gc .\test.ps1).length

Что-то вроде хакерства, чтобы включить завершающую пустую строку:

[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
person manojlds    schedule 02.11.2011
comment
Спасибо! $content = [IO.File]::ReadAllText(".\test.txt"), похоже, делает то же самое, что и $content = (gc ".\test.txt" | out-string). Поскольку второй из двух короче, я предпочитаю это. К сожалению, ни один из предложенных вами методов расчета общего количества строк не учитывает завершающие пустые строки. Есть другие идеи? - person Nick; 02.11.2011
comment
@Nick В .Net (и Windows) будет засчитана любая строка с \r\n. - person manojlds; 02.11.2011
comment
Я немного поэкспериментировал и пришел к тому же, что и ваш обновленный ответ, но я бы не добился этого без вашей помощи, так что большое вам спасибо! - person Nick; 02.11.2011
comment
Есть ли способ прозрачно совместить это с Invoke-WebRequest? - person Kareem; 09.03.2017

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

$text = Get-Content .\file.txt -Raw 
person Shay Levy    schedule 02.11.2011
comment
Это должен быть принятый ответ. Кстати, я почти уверен, что Get-Content работала даже в более ранних версиях. - person MatteoSp; 08.05.2015
comment
@MatteoSp Get-Content сделал, но только до 3.0 он получил -Raw. Без этого он сохраняется как массив строк. - person jpmc26; 30.01.2016
comment
Это должен быть абсолютно принятый ответ. Не помогает то, что в документации указано, что параметр -Raw isn Реализовано ничем родным. - person Richard Szalay; 04.08.2016
comment
Спасибо, это сейчас очень помогло. - person DAhrens; 29.06.2020

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
person Kapé    schedule 26.03.2015
comment
Чтобы использовать пути родственников, сначала разрешите его, например: [IO.File]::ReadAllText((Resolve-Path $filePath)) - person mvanle; 22.08.2015

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

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

person Michael Sorens    schedule 26.08.2012
comment
У меня никогда не получалось, чтобы это работало, если я не ставил обратную косую черту после имени диска. - person Charles Anderson; 09.05.2013
comment
@CharlesAnderson: неясно, какой из трех примеров вы имеете в виду, или, возможно, все они ... тем не менее, я только что подтвердил, что все 3 работают с относительным путем (то есть без обратной косой черты) в PowerShell V3. Кроме того, на момент ответа я использовал V2, поэтому, возможно, что-то еще вызывает проблему в вашей среде. - person Michael Sorens; 09.05.2013
comment
Я имел в виду такие примеры, как $ {C: file.txt}, которые я должен записать как $ {C: \ file.txt}. Да, я полагаю, это связано с моим окружением, но я понятия не имею, что именно. - person Charles Anderson; 10.05.2013
comment
При использовании в качестве L-значения используется кодировка системы по умолчанию. Я попытался установить $ OutputEncoding, но безрезультатно. При использовании в качестве R-значения он создает массив string []. - person robert4; 19.07.2013
comment
Кажется, вы можете использовать только буквальный путь; вы не можете использовать переменную или что-то вроде выражения Join-Path внутри этого. Это раздражает, потому что при передаче через ConvertTo-Json есть огромная разница по сравнению с Get-Content (а результат $ {...} - это то, на что я надеялся. Я не уверен, что это то же самое как Get-Content | Out-String, хотя - person Cameron Kerr; 13.11.2016
comment
@CameronKerr Да, похоже, это так. Я мог бы просто отредактировать этот ответ, чтобы отметить это. - person Justin Dearing; 02.06.2017

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

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

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

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

person Jerry T.    schedule 18.04.2016