Мне нужно как можно быстрее записать во многие файлы, но я не получаю желаемых результатов, используя Streamwriter, как я использую. Например, если я напишу ...
$File = "c:\somefile"
$Contents = get-content $File
$Contents | set-content $File
Так что прочтите содержимое файла, ничего не делайте и запишите его ... Файл точно такой же. Однако если я напишу ...
$File = "c:\somefile"
$Contents = get-content $File
$stream = [System.IO.StreamWriter] $File
$stream.WriteLine("$contents")
$stream.close()
Тогда файл выглядит так, как будто все разрывы строк были проигнорированы, и это немного беспорядок. Что мне нужно сделать, чтобы он написал правильно? Большое спасибо!
2 ответа
Несколько очков
Get-Content
и Set-Content
Get-Content
, когда вы вызываете, он читает файл построчно (не дает вам разрывов строк). Итак, если вы сделаете это:
$Contents = Get-Content $File
Затем $Contents
содержит массив строк, которые представляют строки в файле.
Отправляя это обратно в Set-Content
(который знает, как обрабатывать массив или конвейер строк), он напишет строки .
Массивы в строках
Когда вы используете "$contents"
, элементы массива будут соединяться пробелами, а не символами новой строки, поэтому, когда вы используете $stream.WriteLine
, вы пишете одну строку с одним разрывом строки в конце.
Исправляем это
Используйте
Get-Content $File -Raw
, чтобы прочитать весь файл сразу, если это PowerShell 3+, или используйте следующее, чтобы самому преобразовать его в одну строку.$content = (Get-Content $File) -join "`r`n"
Не делайте этого, а вместо этого используйте следующее:
$stream.Write(($content -join "`r`n"))
Обратите внимание: я использую Write()
, а не WriteLine()
, потому что вам не нужно вставлять дополнительную строку в конец файла (если вы этого не сделаете, но это может сбить с толку, возможно, вы захотите добавить вместо этого к содержанию).
Get-Content
разделит файл по символам новой строки, эффективно удаляя разрывы строк. Используйте переключатель -Raw
, чтобы прочитать файл как одну строку, сохраняя символы новой строки нетронутыми:
$Contents = get-content $File -Raw
Похожие вопросы
Новые вопросы
powershell
PowerShell - это кроссплатформенная утилита командной строки и сценариев от Microsoft. Используйте этот тег только для вопросов о написании и выполнении сценариев PowerShell. Вопросы программирования, относящиеся к кроссплатформенной версии PowerShell Core (Windows, macOS и Linux), должны быть помечены [powershell-core]. Вопросы о системном администрировании следует задавать в случае сбоя суперпользователя или сервера.