Powershell добавляет пробел при сохранении текста из WPF TextBox - PullRequest
0 голосов
/ 27 августа 2018

PowerShell добавляет начальный пробел (к каждой строке от второй строки и далее) каждый раз, когда текст из текстового поля WPF сохраняется в текстовом файле.Следующий код демонстрирует это поведение.Начните с текстового файла с несколькими строками, нажмите «Сохранить», «Закрыть», откройте снова, чтобы увидеть это поведение.

Test1
Test2
Test3

изменяется на

Test1
  Test2
  Test3

Есть ли способ избежать пробела, когда текст из текстового поля сохраняется в текстовом файле?

[xml]$xaml=@"
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test"
        Title="MainWindow" Height="450" Width="500">
    <Grid>
        <TextBox x:Name="Userinput" Height="140" TextWrapping="Wrap" VerticalAlignment="Top" AcceptsReturn="True" AcceptsTab="True" Padding="4" VerticalScrollBarVisibility="Auto" />
        <Button x:Name="Save" Content="Save" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" IsDefault="True" Height="22" Margin="170,150,0,0" />        
    </Grid>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Window=[Windows.Markup.XamlReader]::Load($reader)
#Turn XAML into PowerShell objects
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'x:Name')]]") | ForEach-Object{
Set-Variable -Name ($_.Name) -Value $Window.FindName($_.Name)
}

#Load text from text file.
$Userinput.Text = Get-Content -Path "C:\temp\userinput.txt" -Delimiter "`r`n"  

#Save text
$save.Add_Click({$Userinput.Text | Out-File -NoNewline "C:\temp\userinput.txt"})

#Display Form
$Window.ShowDialog() | Out-Null

1 Ответ

0 голосов
/ 27 августа 2018

$Userinput.Text ожидает одну строку , даже если эта строка содержит несколько строк.Поэтому используйте Get-Content -Raw (PSv3 +) для чтения содержимого файла в виде одной строки:

$Userinput.Text = Get-Content -Raw -LiteralPath C:\temp\userinput.txt

Что касается того, что вы пытались : Get-Content без -Raw возвращает массив строк, причем каждая строка по умолчанию представляет одну строку ввода, где любой из следующих стилей новой строки распознается в качестве разделителей строк в любой комбинации: "`r`n" (CRLF), "`n" (LF), "`r" (CR).

Когда PowerShell приводит массив в строку, он объединяет строковое представление отдельных элементов с одним пробелом между элементами, что объясняет дополнительные пробелы, которые вы видели.

Причина, по которой вы увидели тоже переносы строк - это извращение того, как -Delimiter работает в Windows PowerShell (проблема, которая с тех пор была исправлена ​​в PowerShell Core ): указанный разделитель (разделитель) равен включил в каждый элемент, так что -Delimiter "`r`n" не просто не нужен для возврата массива строк (из-за поведения по умолчанию Get-Content), он фактически включает "`r`n" в конце каждой возвращаемой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...