Я хотел бы использовать 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, но мне это показалось мне легче, чем много вещей выше.