如何在PowerShell中输出没有换行符的文本?

Ami*_*t G 137 powershell

我希望我的PowerShell脚本能够打印出这样的内容:

Enabling feature XYZ......Done
Run Code Online (Sandbox Code Playgroud)

脚本看起来像这样:

Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Run Code Online (Sandbox Code Playgroud)

Write-Output总是在最后打印一个新行,所以我的输出不在一行.有没有办法做到这一点?

Sha*_*evy 157

__PRE__

  • 由于OP的例子特别使用`Write-Output`,它的功能与`Write-Host`截然不同.在复制/粘贴答案之前,读者应注意这一重大差异. (52认同)
  • 除了使用write-host通常是错误的命令 (45认同)
  • 因为OP的例子特别使用`Write-Output`而被低估了.`Write-Output`没有`-NoNewLine`参数. (12认同)
  • `Write-Host`几乎不是正确的答案.它相当于在Unixland中执行`>/dev/tty`. (6认同)
  • 我同意@NathanAldenSr,如果您尝试输出到文件等,Write-Host没有帮助. (5认同)
  • `Write-Host` 与 `Write-Information` 相同,并且可重定向为输出流 6。因此,您可以将其重定向到文件“6>output.txt”。它没有“自己的思想”,只是你不能从 Unixland 带来知识而已,所以很多人都误解了它。 (3认同)
  • 在某些情况下,“写入进度”可能是合适的,请参见下面的示例。 (2认同)

Tho*_*mas 42

不幸的是,正如几个答案和评论中所指出的那样,Write-Host可能是危险的,不能通过管道输送到其他进程并且Write-Output没有-NoNewline标志.

但是,这些方法是"*nix的"方式来显示进程中,"的PowerShell"的方式做到这一点似乎是Write-Progress:它会显示与进度信息PowerShell窗口顶部从PowerShell的3.0条,可用以后,看说明书的细节.

# Total time to sleep
$start_sleep = 120

# Time to sleep between each notification
$sleep_iteration = 30

Write-Output ( "Sleeping {0} seconds ... " -f ($start_sleep) )
for ($i=1 ; $i -le ([int]$start_sleep/$sleep_iteration) ; $i++) {
    Start-Sleep -Seconds $sleep_iteration
    Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) ( " {0}s ..." -f ($i*$sleep_iteration) )
}
Write-Progress -CurrentOperation ("Sleep {0}s" -f ($start_sleep)) -Completed "Done waiting for X to finish"
Run Code Online (Sandbox Code Playgroud)

并采取OP的例子:

# For the file log
Write-Output "Enabling feature XYZ"

# For the operator
Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... " )

Enable-SPFeature...

# For the operator
Write-Progress -CurrentOperation "EnablingFeatureXYZ" ( "Enabling feature XYZ ... Done" )

# For the log file
Write-Output "Feature XYZ enabled"
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是显示状态的最佳解决方案。如果您需要日志或其他东西,则必须使用Write-Output的换行符。 (3认同)

shu*_*ler 14

虽然它可能不适用于您的情况(因为您向用户提供信息输出),创建一个可用于追加输出的字符串.当输出它时,只输出字符串.

当然忽略这个例子在你的情况下很愚蠢但在概念上很有用:

$output = "Enabling feature XYZ......."
Enable-SPFeature...
$output += "Done"
Write-Output $output
Run Code Online (Sandbox Code Playgroud)

显示:

Enabling feature XYZ.......Done
Run Code Online (Sandbox Code Playgroud)

  • 我不明白,谁给这个问题多了1个upwote,因为_这不是重点因为**整个输出在安装功能后出现**_ (9认同)
  • 这不是重点,因为在安装该功能后会出现整个输出. (6认同)
  • “当然忽略​​这个例子在你的情况下很愚蠢,但在概念上很有用:” (3认同)
  • 这在提供的特定示例中可能有效,但“Write-Output”仍然会产生额外的换行。合理的解决方法,但不是解决方案。 (2认同)

Mar*_*vis 6

是的,因为其他答案都有状态,所以无法使用Write-Output完成。如果PowerShell发生故障,请转到.NET,这里甚至还有几个.NET答案,但它们比实际需要的要复杂得多。

只需使用:

[Console]::Write("Enabling feature XYZ.......")
Enable-SPFeature...
Write-Output "Done"
Run Code Online (Sandbox Code Playgroud)

它不是最纯的PowerShell,但可以运行。

  • 投反对票的原因是它的行为类似于“写主机”,只是人们不希望这样做。 (5认同)

Fri*_*ave 5

要写入文件,可以使用字节数组。以下示例创建一个空 ZIP 文件,您可以向其中添加文件:

[Byte[]] $zipHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
[System.IO.File]::WriteAllBytes("C:\My.zip", $zipHeader)
Run Code Online (Sandbox Code Playgroud)

或者使用:

[Byte[]] $text = [System.Text.Encoding]::UTF8.getBytes("Enabling feature XYZ.......")
[System.IO.File]::WriteAllBytes("C:\My.zip", $text)
Run Code Online (Sandbox Code Playgroud)


maj*_*tor 5

在 PowerShell 中似乎没有办法做到这一点。以前的所有答案都不正确,因为它们的行为方式不同Write-Output,但更像Write-Host是没有这个问题。

Write-Hostcloses 解决方案似乎与参数一起使用-NoNewLine。您不能通过管道传输这通常是一个问题,但有一种方法可以覆盖此函数,如Write-Host => Export to a file中所述,因此您可以轻松地使其接受输出文件的参数。这还远不是一个好的解决方案。这样Start-Transcript更有用,但该 cmdlet 在本机应用程序中存在问题。

Write-Output根本无法在一般情况下做你需要的事情。

2023 年编辑:

你可以疯狂地做这样的事情:

function log ($msg, [switch] $NoNewLine)
{
    $script:_msg+=$msg

    if ($NoNewLine)
    {
        Write-Host -NoNewline $msg
    }
    else
    {
        Write-Host $msg
        $script:_msg >> output.txt
        $script:_msg = ''
    }
}
Run Code Online (Sandbox Code Playgroud)

测试:

log 'enabling feature xyx ' -NoNewLine; 1..3 | % { sleep 1; log . -NoNewLine }; log ' ok'; cat output.txt`
> enabling feature xyx ... ok
Run Code Online (Sandbox Code Playgroud)