Відповіді:
Щоб отримати весь вміст файлу:
$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
\r\n
буде враховано.
Invoke-WebRequest
?
З іншого боку, в PowerShell 3.0 ви можете використовувати Get-Content
командлет з новим перемикачем Raw:
$text = Get-Content .\file.txt -Raw
Get-Content
зробив, але це було не тільки до 3.0 -Raw
. Без цього він зберігається як масив рядків.
-Raw
параметр не реалізований жодним нативним.
$text = Get-Content $filePath | Out-String
У IO.File.ReadAllText
мене не було відносного шляху, він шукає файл %USERPROFILE%\$filePath
замість поточного каталогу (при запуску з Powershell ISE принаймні):
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
[IO.File]::ReadAllText((Resolve-Path $filePath))
Ще один підхід до читання файлу, який мені подобається, називається по-різному як нотація змінної або синтаксис змінної і включає просто закриття filepec у фігурні дужки, що передують знаку долара:
$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}
) це не працює. На цьому диску немає обмежень на filepec: він може бути абсолютним або відносним.
Get-Content захоплює дані та скидає їх у масив, рядок за рядком. Якщо припустити, що немає інших спеціальних вимог, ніж ви перераховані, ви можете просто зберегти свій вміст у змінній?
$file = Get-Content c:\file\whatever.txt
Запуск лише $file
поверне повний вміст. Тоді можна просто зробити$file.Count
(оскільки масиви вже мають вбудований метод підрахунку), щоб отримати загальну кількість # рядків.
Сподіваюся, це допомагає! Я не майстер сценаріїв, але мені це здалося легшим, ніж багато речей вище.
$content = [IO.File]::ReadAllText(".\test.txt")
здається, робить те саме, що і$content = (gc ".\test.txt" | out-string)
. Оскільки другий з двох коротший, саме тому я віддаю перевагу. На жаль, жоден із методів, які ви надали для обчислення загальної кількості рядків, не враховує проміжні порожні рядки. Будь-які інші ідеї?