gpt4 book ai didi

powershell - Set-Content 在我的文件末尾附加一个换行符(换行符、CRLF)

转载 作者:行者123 更新时间:2023-12-02 23:50:19 44 4
gpt4 key购买 nike

我的原始配置文件(web1.config)没有多余的行,在记事本中查看时(显示所有字符)如下所示:

enter image description here

 <?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.6" />
<httpRuntime targetFramework="4.6" />
</system.web>
<appSettings>
<add key="myConnectionString" value="server=localhost;database=myDb;uid=myUser;password=myPass;" />
</appSettings>
</configuration>

现在,我需要应用脚本将数据库名称更改为其他名称,如下所示:

 Move-Item "web1.config" "webtemp.config"
Get-Content "webtemp.config" | ForEach-Object {$_ -replace "database=myDb;", "database=newDb;"} |Set-Content "web1.config" -Force
Remove-Item "webtemp.config"
Write-Output('Settings Changed')

因此,生成的新文件 (web1.config) 如下所示:

enter image description here

注意文件末尾添加的额外行(完全不需要)我尝试了所有其他选项,例如:

  • 使用out-file API
  • 使用.NET方法System.IO.StreamWriter
  • 使用 -nonewline 标志(它将所有 10 行转换为单行)
  • 使用不同的编码选项
  • 尝试将 \r\n 替换为 \r (不起作用,因为 set-content 总是生成 crlf)

我使用的是 PowerShell v5.1。

最佳答案

tl;dr(PSv5+;请参阅底部了解旧版本):

(Get-Content webtemp.config) -replace 'database=myDb;', 'database=newDb;' -join "`n" |
Set-Content -NoNewline -Force web1.config

注意:如果您想要 Windows 风格的 CRLF 行结尾而不是 Unix 风格的 LF,请将 "`n" 替换为 "`r`n"仅行结尾(PowerShell 和许多实用程序都可以处理这两种情况)。

<小时/>

PSv5+中,Set-Content支持-NoNewline开关,该开关指示Set-Content 不要在每个输入对象后添加换行符(换行符)。这同样适用于 Add-ContentOut-File cmdlet。

换句话说:Set-Content -NoNewline 直接连接所有其输入对象的字符串表示形式 :

PS> 'one', 'two' | Set-Content -NoNewline tmp.txt; Get-Content tmp.txt
onetwo

如果您传递给 Set-Content -NoNewline 的是一个单个字符串,并且已经嵌入了换行符,您可以使用它按原样并获得所需的结果:

PS> "one`ntwo" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?"
one
two?

请注意,Get-Content -Raw 按原样读取文件作为一个整体(除了字符解码),并且 ? 直接出现在 two 之后意味着该文件没有尾随换行符。

就您而言,由于您正在逐个处理输入行(通过 Get-Content 不使用 -Raw),因此输出行(字符串)的数组,您必须首先使用换行符作为分隔符将它们连接起来 - 仅在行之间 - 并将结果传递给Set-Content -NoNewline,如顶部所示;这是一个简化的示例:

PS> ('one', 'two') -join "`n" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?"
one
two?

'one', 'two' 是一个二元素字符串数组,它是逐行处理命令的替代。

编码说明:

在 Windows PowerShell 中,Set-Content 默认情况下根据系统的旧版单字节代码页生成“ANSI”编码文件。
要显式控制编码,请使用 -Encoding 参数。

<小时/>

PSv4- 中,需要使用 .NET Framework 的解决方案:

PS> [System.IO.File]::WriteAllText('tmp.txt', ('one', 'two') -join "`n"); "$(Get-Content -Raw tmp.txt)?"
one
two?

请注意[System.IO.File]::WriteAllText() ,在没有编码参数的情况下,默认为无 BOM UTF-8。
通过所需的[System.Text.Encoding]根据需要将实例编码为第三个参数。

关于powershell - Set-Content 在我的文件末尾附加一个换行符(换行符、CRLF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45266461/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com