Я хотел бы использовать PowerShell для хранения всего содержимого текстового файла (включая завершающую пустую строку, которая может существовать или не существовать) в переменной. Я также хотел бы знать общее количество строк в текстовом файле. Как это сделать наиболее эффективно?
PowerShell: хранить все содержимое текстового файла в переменной
Ответы (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
$content = [IO.File]::ReadAllText(".\test.txt")
, похоже, делает то же самое, что и $content = (gc ".\test.txt" | out-string)
. Поскольку второй из двух короче, я предпочитаю это. К сожалению, ни один из предложенных вами методов расчета общего количества строк не учитывает завершающие пустые строки. Есть другие идеи?
- person Nick; 02.11.2011
\r\n
.
- person manojlds; 02.11.2011
Invoke-WebRequest
?
- person Kareem; 09.03.2017
Кстати, в PowerShell 3.0 вы можете использовать командлет Get-Content
с новым переключателем Raw:
$text = Get-Content .\file.txt -Raw
Get-Content
сделал, но только до 3.0 он получил -Raw
. Без этого он сохраняется как массив строк.
- person jpmc26; 30.01.2016
-Raw
isn Реализовано ничем родным.
- person Richard Szalay; 04.08.2016
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
[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}
) не работает. Никаких ограничений на спецификацию файлов на этом диске: она может быть абсолютной или относительной.
Get-Content собирает данные и построчно выгружает их в массив. Предполагая, что нет других особых требований, кроме перечисленных, вы можете просто сохранить свой контент в переменной?
$file = Get-Content c:\file\whatever.txt
Запуск только $file
вернет все содержимое. Затем вы можете просто сделать $file.Count
(потому что в массивы уже встроен метод count), чтобы получить общее количество строк.
Надеюсь это поможет! Я не специалист по написанию сценариев, но мне это показалось проще, чем многое из вышеперечисленного.