我希望PowerShell脚本能够打印出这样的内容:
Enabling feature XYZ......Done
脚本看起来像这样:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
但是Write-Output
总是在末尾打印一个新行,所以我的输出不在一行上。有没有办法做到这一点?
答案 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 ”的标志,基本上是相同的。