Write-Host =>导出到文件

时间:2012-02-15 13:22:42

标签: powershell powershell-v2.0 powershell-v1.0

我有一些脚本包含Write-Host "Server1"等命令。如何将其导出到文件?

当我尝试使用script > export.txt时,它无效。

4 个答案:

答案 0 :(得分:23)

Write-Host仅将输出重定向到控制台。

您可以使用Write-Output并重定向到文件(> export.txt或管道到Out-File export.txt

在绝对需要重定向脚本的所有输出的极端情况下,请查看此cmdlet:

Start-Transcript
Get-Help Start-Transcript -full

答案 1 :(得分:9)

在PowerShell中script > export.txtscript | Out-File -path export.txt的语法糖。

Write-Host将对象发送到主机,并且不返回任何对象。这意味着没有对象通过管道输出到Out-File cmdlet,并且没有任何内容写入export.txt文件。解决方法(如果您不想更改脚本)是打开cmd控制台并使用cmd控制台重定向重定向PowerShell输出。

C:\> powershell .\script.ps1 > .\export.txt

答案 2 :(得分:6)

当然,不同方法的用处很大程度上取决于您的用例,但是......

"对"我相信,如果你能控制脚本(这就是我通常所做的,虽然不可否认我今天正在寻找一条捷径),这样做的方法是"重载" Write-Host ,可以说是,然后将您要发送给Write-Host的所有内容发送到此新功能。

为了保留有效的PowerShell动词,我称之为Write-Feedback

function Write-Feedback()
{
    param
    (
        [Parameter(Position=0,ValueFromPipeline=$true)]
        [string]$msg,
        [string]$BackgroundColor = "Yellow",
        [string]$ForegroundColor = "Black"
    )

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
}

所以现在你有一个与Write-Host基本相同的函数,但你可以轻松控制输出的位置。如果您需要写入文件,可以编辑Write-Feedback以便其所有调用现在都可以执行您需要的操作。

您可以简单地将该行更改为Write-Output,具体取决于您是否正在管道中执行任何其他操作...

...
Write-Output $msg;

您可以将输出发送到您将命令的其余部分发送到同一文件,但在Write-Feedback函数内,甚至保留写入主机:

function Write-Feedback()
{
    param
    (
        [Parameter(Position=0,ValueFromPipeline=$true)]
        [string]$msg,
        [string]$BackgroundColor = "Yellow",
        [string]$ForegroundColor = "Black"
    )

    Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
    $msg | Out-File "./export.txt" -Append; # <<< or add a param to location
}

或者如果您有一些异常值,您不希望将Write-Feedback内容传送到文件,您可以添加一个新的可选参数,询问如何处理每个特定的{{1调用你Write-Feedback - 并发送到文件,switchWrite-Host等 - 将默认值更改为您通常想要的内容,并明确{{1}关闭它明确设置的新参数。

等等。在PowerShell中将所有调用路由到集中式清算中以便输出更容易。然后当你改变你的想法时,它不是一个巨大的搜索和替换 - 并且替换回任务。

我认为这里唯一的痛苦就是如果你不想把事情发送到管道中,那么Write-Output已经出局,但确实想要确保文件switch写到的是与您在示例Write-Output中指定的内容相同,而不是每次都编辑Write-Feedback。我不确定是否有一种简单的方法可以做到这一点。

但是,既然您已经从管道步骤&#34;中删除了一步,那么这可能不是一个合法的用例。

无论如何,最重要的是重载> export.txt并在一个地方进行编辑。

答案 3 :(得分:0)

使用*>代替>对我有效。它将所有输出重定向到文件;屏幕上没有任何显示。