tee-object为什么不能与NoNewline一起使用?

时间:2019-06-25 19:46:28

标签: powershell

我的脚本中具有以下功能

function Write-Host($object) 
{
    if($global:LogFile -eq $null)
    {
        $global:LogFile = $logFile
    }

    $object | tee $global:LogFile -Append
}

引用此帖子:https://stackoverflow.com/a/25847258/8397835

我在这里专门尝试这部分:

$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 10 }
while (($job.State -eq "Running") -and ($job.State -ne "NotStarted"))
{
    Write-Host ([char]9632) -NoNewLine
    Start-Sleep -Seconds 1
}

显然,使用tee时,nonewline似乎被忽略了……而没有使用tee时,我正在将字符显示在我要查找的一行上

有T恤:

tee

不带发球区

without tee

我想我知道发生了什么事。由于将写主机转换为tee,因此任何开关都将被忽略,无论是彩色还是nonewline。如何使nonewline与tee配合使用?

1 个答案:

答案 0 :(得分:1)

在我们chat之后,我了解您正在尝试做什么。您想要编写一个自定义进度条,该进度条既可以写入日志文件,也可以写入控制台,并且两者都没有换行符。为此,您可以编写一个可以完成此功能的函数,但是我建议您选择一个与现有cmdlet不冲突的新名称。我将使用Write-MyProgress

Function Write-MyProgress{ 
[cmdletbinding()] 
Param( 
    [parameter(valuefrompipeline=$true)]$message, 
    [switch]$NoNewLine 
)
    if($global:LogFile -eq $null) 
    { 
        $global:LogFile = $logFile 
    }
    Add-Content -Value $message -Path $LogFile -NoNewline:$NoNewLine
    Write-Host $Message -NoNewLine:$NoNewLine 
}

然后可以显式调用它:

Write-MyProgress ([char]9632) -NoNewLine

或通过管道发送内容:

[char]9632 | Write-MyProgress -NoNewLine

或者,如果您不想使用函数,则可以使用本机cmdlet来完成所有操作,如本例所示:

1..10 | ForEach-Object -Process {
    [char]9632 | Add-Content $LogFile -NoNewLine -PassThru | Write-Host -NoNewLine
    start-sleep -Sec 1
} -End {Add-Content -Value '' -Path $LogFile}

(请注意,我将''添加到日志文件的末尾,因此进度条完成后日志文件会换行)