Tee-Object没有像许多其他输出到文件-cmdlet那样的-NoNewline开关(例如Out-File、Set-Content)。在引擎盖下面,Tee-Object使用Out-File写入文件,默认情况下该文件添加一个尾换行符。
由于我(目前)无法通过-NoNewline交换机通过Tee-Object,是否有另一种方法可以强制底层Out-File不添加尾随换行符?看看Out-File,现在可能有办法了,但也许有人知道有一些技巧/黑客可以达到这个目的吗?
一些制约因素:
Tee-Object (或替代解决方案)Tee-Object生成的文件(或者另一种解决方案)进行后置处理,比如再次打开它们并删除(最后)换行符。复制代码:
"Test" | Tee-Object file | Out-Null在Windows上,生成的文件file将包含6个字节,如下所示:
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。
发布于 2021-12-14 13:49:15
您可以自己滚动并编写一个前缀换行符:
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不同,上面的函数是永久的“追加模式”。将其重构以支持附加和覆盖都是留给读者的练习:)
https://stackoverflow.com/questions/70349532
复制相似问题