首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使‘trailing’在PowerShell中不添加尾随换行符?

如何使‘trailing’在PowerShell中不添加尾随换行符?
EN

Stack Overflow用户
提问于 2021-12-14 13:19:53
回答 1查看 136关注 0票数 1

Tee-Object没有像许多其他输出到文件-cmdlet那样的-NoNewline开关(例如Out-FileSet-Content)。在引擎盖下面Tee-Object使用Out-File写入文件,默认情况下该文件添加一个尾换行符。

由于我(目前)无法通过-NoNewline交换机通过Tee-Object,是否有另一种方法可以强制底层Out-File不添加尾随换行符?看看Out-File,现在可能有办法了,但也许有人知道有一些技巧/黑客可以达到这个目的吗?

一些制约因素:

  • 我希望在管道中使用Tee-Object (或替代解决方案)
  • 我不想对Tee-Object生成的文件(或者另一种解决方案)进行后置处理,比如再次打开它们并删除(最后)换行符。

复制代码:

代码语言:javascript
复制
"Test" | Tee-Object file | Out-Null

在Windows上,生成的文件file将包含6个字节,如下所示:

代码语言:javascript
复制
          00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
00000000  54 65 73 74 0D 0A                               Test..

不幸的是,它包含了0D 0A中的额外字节-- a. k. a. `r`n或CR&LF。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 13:49:15

您可以自己滚动并编写一个前缀换行符:

代码语言:javascript
复制
function Tee-StackProtectorObject {
    param(
        [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
        [AllowNull()]
        [AllowEmptyCollection()]
        [psobject]
        $InputObject,

        [Parameter(ParameterSetName='Path', Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)]
        [string[]]
        $Path,

        [Parameter(ParameterSetName='LiteralPath', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
        [Alias('PSPath')]
        [string[]]
        $LiteralPath
    )

    begin {
        # Determine newline character sequence at the start (might differ across platforms)
        $newLine = [Environment]::NewLine

        # Prepare parameter arguments for Add-Content
        $addContentParams = @{ NoNewLine = $true }
        if($PSCmdlet.ParameterSetName -eq 'Path'){
            $addContentParams['Path'] = $Path
        }
        else {
            $addContentParams['LiteralPath'] = $LiteralPath
        }
    }

    process {
        # Write to file twice - first a newline, then the content without trailling newline
        Add-Content -Value $newLine @addContentParams
        Add-Content -Value $InputObject @addContentParams

        # Write back to pipeline
        Write-Output -InputObject $InputObject
    }
}

注意,与Tee-Object不同,上面的函数是永久的“追加模式”。将其重构以支持附加和覆盖都是留给读者的练习:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70349532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档