Мне нужно как можно быстрее записать во многие файлы, но я не получаю желаемых результатов, используя 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()

Тогда файл выглядит так, как будто все разрывы строк были проигнорированы, и это немного беспорядок. Что мне нужно сделать, чтобы он написал правильно? Большое спасибо!

4
OreoRyan 26 Фев 2015 в 00:51

2 ответа

Лучший ответ

Несколько очков

Get-Content и Set-Content

Get-Content, когда вы вызываете, он читает файл построчно (не дает вам разрывов строк). Итак, если вы сделаете это:

$Contents = Get-Content $File

Затем $Contents содержит массив строк, которые представляют строки в файле.

Отправляя это обратно в Set-Content (который знает, как обрабатывать массив или конвейер строк), он напишет строки .

Массивы в строках

Когда вы используете "$contents", элементы массива будут соединяться пробелами, а не символами новой строки, поэтому, когда вы используете $stream.WriteLine, вы пишете одну строку с одним разрывом строки в конце.

Исправляем это

  1. Используйте Get-Content $File -Raw, чтобы прочитать весь файл сразу, если это PowerShell 3+, или используйте следующее, чтобы самому преобразовать его в одну строку.

    $content = (Get-Content $File) -join "`r`n" 
    
  2. Не делайте этого, а вместо этого используйте следующее:

    $stream.Write(($content -join "`r`n"))
    

Обратите внимание: я использую Write(), а не WriteLine(), потому что вам не нужно вставлять дополнительную строку в конец файла (если вы этого не сделаете, но это может сбить с толку, возможно, вы захотите добавить вместо этого к содержанию).

1
briantist 25 Фев 2015 в 22:04

Get-Content разделит файл по символам новой строки, эффективно удаляя разрывы строк. Используйте переключатель -Raw, чтобы прочитать файл как одну строку, сохраняя символы новой строки нетронутыми:

$Contents = get-content $File -Raw
4
mjolinor 25 Фев 2015 в 22:00