gpt4 book ai didi

powershell - 如何防止 PowerShell 脚本中的尾随换行符?

转载 作者:行者123 更新时间:2023-12-05 03:41:52 54 4
gpt4 key购买 nike

此代码添加行,即使在使用“-NoNewline”时也是如此

$LST1="OsName","OsVersion","TimeZone","CsName"
$LST2="CsManufacturer","CsModel","CsSystemType","BiosBIOSVersion","BiosReleaseDate"
$MEM1 = (Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))})
$Pro1 = "systemname","DeviceID","numberOfCores","NumberOfLogicalProcessors"

Add-Content OutText.txt "OS Information:" -NoNewline
Get-ComputerInfo -Property $LST1 | Format-List | Out-File -Encoding ASCII -FilePath OutText.txt -Append
Add-Content OutText.txt "Hardware Information:" -NoNewline
Get-ComputerInfo -Property $LST2 | Format-List | Out-File -Encoding ASCII -FilePath OutText.txt -Append
Add-Content OutText.txt "RAM: $RAM1 GB" -NoNewline
Get-WmiObject -class win32_processor -Property $Pro1 | Select-Object -Property $Pro1 | Out-File -FilePath OutText.txt -Encoding ASCII -Append

换行太多:

Too many lines breaks

最佳答案

Theo在评论中提供了关键指针:

(Get-ComputerInfo -Property $LST1 | Format-List | Out-String).Trim() | 
Add-Content -Path $path -NoNewline

让我详细说明:

  • 防止 Format-List 输出中的前导和尾随空行通过 Out-File 显示在文件中/>使用Out-String首先创建格式化输出的内存中字符串表示

  • 然后您可以申请 .Trim() 添加到生成的多行字符串中,以便Out-String 的输出中删除前导行和尾随行(一般为空白)

由于 Out-String 本身呈现了 Format-List 输出的格式化指令,因此您可以使用 Set-ContentAdd-Content将生成的 string 保存/附加到文件。


Out-String 的行为:

Out-String 生成与默认情况下在控制台中或通过其他 Out-* cmdlet 获得的相同的for-display 表示, 特别是 Out-File/> - 默认为单行多行字符串。

虽然这种表示可能本身包含空行,这是典型的,Out-String 另外会附加一个尾随换行符,甚至尽管没有充分的理由这样做,如GitHub issue #14444 中所讨论的那样.

如果您希望删除这个多余的尾随换行符,您可以使用以下方法,通过-replace operator (该操作适用于 Windows 风格的 CRLF 换行符(\r\n)和 Unix 风格的仅 LF 换行符(\n)):

(... | Out-String) -replace '\r?\n\z'

或者,效率较低,使用 -Stream 开关单独输出行,然后用换行符重新加入它们没有尾随("`n" 创建一个仅 LF 换行符,PowerShell 可以将其与 CRLF 换行符 ("`r`n") 互换):

(... | Out-String -Stream) -join "`n"

Out-String 应用于来自外部程序的输出:

Out-String 也可用于捕获外部程序输出的行作为单个多行字符串(默认情况下,PowerShell 捕获输出逐行,当在变量中捕获时产生字符串的数组

但是,Out-String 的使用有问题:

  • 附加的尾随换行符也很麻烦。

  • Windows PowerShell 中有一个额外的麻烦(此后已在 PowerShell (Core) 7+ 中得到纠正):如果您使用 2 >&1 将 stderr 输出合并到成功输出流中,第一个 stderr 行的格式类似于 PowerShell 错误

    • 运行 cmd/c 'echo yes & echo no >&2' 2>&1 | Out-String 看问题。

以下习语避免了这两个问题(... 代表您的外部程序调用):

$multiLineString = [string[]] (... 2>&1) -join "`n"

注意:上面使用仅 LF 换行符来连接数组元素,这通常就足够了。将 "`r`n" 用于 CRLF 换行符或将 [Environment]::NewLine 用于 OS-appropriate 换行符序列。

示例:

以下 cmd.exe CLI 调用同时输出 stdout 行和 stderr 行,PowerShell 端的 2>&1 将两者合并到成功输出流中.

PS> [string[]] (cmd /c 'echo yes & echo no >&2' 2>&1) -join "`n" |
ForEach-Object { "[$_]" } # just to visualize the string boundaries
[yes
no ]

注意:no 后的尾随空格是由于 cmd.exe 的内置 echo 的异常行为造成的命令:它在其输出中包含 >&2 重定向之前的空格。

关于powershell - 如何防止 PowerShell 脚本中的尾随换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67538527/

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