【问题标题】:Powershell adds leading space when saving text from WPF TextBox从 WPF TextBox 保存文本时,Powershell 添加了前导空格
【发布时间】:2018-08-28 04:57:59
【问题描述】:

每次将 WPF 文本框中的文本保存到文本文件时,PowerShell 都会添加一个前导空格(从第二行开始到每一行)。下面的代码演示了这种行为。从一个只有几行的文本文件开始,点击保存、关闭、重新打开以查看此行为。

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

【问题讨论】:

    标签: wpf powershell


    【解决方案1】:

    $Userinput.Text 需要单个字符串,即使该字符串包含多行。因此,使用Get-Content -Raw (PSv3+) 将文件内容读取为单个字符串:

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

    至于 你尝试了什么:没有-RawGet-Content 返回一个字符串array,默认情况下每个字符串代表一个输入行,其中任何一个以下换行样式可任意组合识别为行分隔符:"`r`n" (CRLF)、"`n" (LF)、"`r" (CR)。

    当 PowerShell 将数组强制转换为字符串时,它会将其各个元素的字符串表示形式与元素之间的单个空格连接起来,这解释了您看到的额外空格。

    您也看到 换行符的原因是 -Delimiter 在 Windows PowerShell 中的工作方式的一个怪癖(这个问题已经在 PowerShell Core 中得到解决):指定的分隔符(分隔符)在每个元素中包含,因此-Delimiter "`r`n" 不仅不需要返回行数组(由于Get-Content 的默认行为),它实际上包括"`r`n" 在每行末尾返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2016-09-27
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多