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

时间:2010-10-09 15:49:33

标签: powershell

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

Enabling feature XYZ......Done

脚本看起来像这样:

Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"

但是Write-Output总是在末尾打印一个新行,所以我的输出不在一行上。有没有办法做到这一点?

17 个答案:

答案 0 :(得分:140)

Write-Host -NoNewline "Enabling feature XYZ......."

答案 1 :(得分:31)

不幸的是,正如一些答案和评论中所述,Write-Host可能很危险,无法通过管道传输到其他流程,Write-Output没有-NoNewline标记。

但这些方法是显示进度的“* nix”方式,“PowerShell”方式似乎是Write-Progress:它在PowerShell窗口顶部显示一个条形图,其中包含进度信息,可用从PowerShell 3.0开始,see manual了解详细信息。

# 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"

采取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"

答案 2 :(得分:14)

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

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

$output = "Enabling feature XYZ......."
Enable-SPFeature...
$output += "Done"
Write-Output $output

显示:

Enabling feature XYZ.......Done

答案 3 :(得分:2)

要写入文件,您可以使用字节数组。以下示例创建一个空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)

或使用:

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

答案 4 :(得分:2)

我遇到的问题是,在使用PowerShell v2时,Write-Output实际上会对输出进行换行,至少对于stdout。我试图将一个XML文本写入stdout但没有成功,因为它很难包装在80字符中。

解决方法是使用

[Console]::Out.Write($myVeryLongXMLTextBlobLine)

这不是PowerShell v3中的问题。写输出似乎在那里正常工作。

根据PowerShell脚本的调用方式,您可能需要使用

[Console]::BufferWidth =< length of string, e.g. 10000)
在你写到stdout之前

答案 5 :(得分:2)

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

关闭解决方案似乎使用Write-Host参数-NoNewLine。你不能管道这通常是一个问题,但有一种方法可以覆盖这个函数,如 Write-Host => Export to a file 中所述,所以你可以很容易地让它接受输出文件的参数。这仍然是一个很好的解决方案。使用Start-Transcript这更有用,但该cmdlet在本机应用程序中存在问题。

Write-Output根本无法在一般情境中执行您所需的操作。

答案 6 :(得分:2)

是的,由于其他答案都有状态,因此无法通过写入输出完成。在PowerShell失败的地方,转向.NET,这里甚至有几个.NET答案,但它们比它们需要的更复杂。

只需使用:

[Console]::Write("Enabling feature XYZ.......")
Enable-SPFeature...
Write-Output "Done"

它不是最纯粹的PowerShell,但它确实有效。

答案 7 :(得分:2)

Write-Host非常糟糕,是世界的毁灭者,但你可以使用它来向用户显示进度,同时使用Write-Output记录(而不是OP要求记录)。

Write-Output "Enabling feature XYZ" | Out-File "log.txt" # Pipe to log file Write-Host -NoNewLine "Enabling feature XYZ......." $result = Enable-SPFeature $result | Out-File "log.txt" # You could try{}catch{} an exception on Enable-SPFeature depending on what it's doing if ($result -ne $null) { Write-Host "complete" } else { Write-Host "failed" }

答案 8 :(得分:1)

你根本无法让PowerShell省略那些讨厌的换行符......没有脚本或cmdlet可以做到。当然,Write-Host绝对是胡说八道,因为你无法从中重定向/管道!

尽管如此,您可以编写自己的EXE文件来执行此操作,这就是我在Stack Overflow问题 How to output something in PowerShell 中解释的操作方法。

答案 9 :(得分:1)

简化FrinkTheBrave的回应:

[System.IO.File]::WriteAllText("c:\temp\myFile.txt", $myContent)

答案 10 :(得分:0)

内联连接的最简单方法 - 并在移动到“写入-输出”时;例如2 个制表符(字符串),然后是文字/逐字(字符串):

Write-Output ("`t`t" + '${devArg}')

答案 11 :(得分:0)

$host.UI.Write('Enabling feature XYZ.......')
Enable-SPFeature...
$host.UI.WriteLine('Done')

答案 12 :(得分:0)

我作弊,但我相信这是解决所有要求的唯一答案。也就是说,这避免了尾随的CRLF,同时为其他操作提供了完成的位置,并在必要时适当地重定向到stdout。

$c_sharp_source = @"
using System;
namespace StackOverflow
{
   public class ConsoleOut
   {
      public static void Main(string[] args)
      {
         Console.Write(args[0]);
      }
   }
}
"@
$compiler_parameters = New-Object System.CodeDom.Compiler.CompilerParameters
$compiler_parameters.GenerateExecutable = $true
$compiler_parameters.OutputAssembly = "consoleout.exe"
Add-Type -TypeDefinition $c_sharp_source -Language CSharp -CompilerParameters $compiler_parameters

.\consoleout.exe "Enabling feature XYZ......."
Write-Output 'Done.'

答案 13 :(得分:0)

它可能不是非常优雅,但它完全符合OP的要求。请注意,ISE与StdOut混淆,因此不会输出。为了查看此脚本的工作原理,它无法在ISE中运行。

$stdout=[System.Console]::OpenStandardOutput()
$strOutput="Enabling feature XYZ... "
$stdout.Write(([System.Text.Encoding]::ASCII.GetBytes($strOutput)),0,$strOutput.Length)
Enable-SPFeature...
$strOutput="Done"
$stdout.Write(([System.Text.Encoding]::ASCII.GetBytes($strOutput)),0,$strOutput.Length)
$stdout.Close()

答案 14 :(得分:0)

以下内容将光标放回上一行的开头。您可以将它放在正确的水平位置(使用$ pos.X将其横向移动):

$pos = $host.ui.RawUI.get_cursorPosition()
$pos.Y -= 1
$host.UI.RawUI.set_cursorPosition($Pos)

您当前的输出超过了27个空格,因此 $ pos.X = 27 可能会有效。

答案 15 :(得分:-1)

期望的o / p: 启用功能XYZ ......完成

您可以使用以下命令

$ a =“启用XYZ功能”

写输出“ $ a ......完成”

您必须在引号内添加变量和语句。希望这会有所帮助:)

谢谢 技术

答案 16 :(得分:-2)

你绝对可以这样做。 Write-Output有一个名为“ NoEnumerate ”的标志,基本上是相同的。