16

我有一个包含一些命令的脚本,例如Write-Host "Server1". 如何将其导出到文件?

当我尝试使用script > export.txt它时,它不起作用。

4

4 回答 4

25

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

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

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

Start-Transcript
Get-Help Start-Transcript -full
于 2012-02-15T13:34:17.047 回答
12

在 PowerShellscript > export.txt中是script | Out-File -path export.txt.

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

C:\> powershell .\script.ps1 > .\export.txt
于 2012-02-15T14:13:00.633 回答
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"
    )

    process {
        $msg | ForEach-Object {
            Write-Host `
                -BackgroundColor $BackgroundColor `
                -ForegroundColor $ForegroundColor `
                $_;
        }
    }
}

所以现在你有了一个与 基本相同的函数Write-Host,但是你可以很容易地控制输出的去向。如果您需要写入文件,您可以进行编辑Write-Feedback,以便它的所有调用现在都可以执行您需要的任何操作。

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

...
Write-Output $_;

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

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

    process {
        $msg | ForEach-Object {
            Write-Host `
                -BackgroundColor $BackgroundColor `
                -ForegroundColor $ForegroundColor `
                $_;

            $_ | Out-File "./export.txt" -Append; # <<< or add a param to location
        }
    }
}

或者,如果您有一些不希望将Write-Feedback内容通过管道传输到文件的异常值,您可以添加一个新的可选参数,询问如何处理Write-Feedback您退出的每个特定调用switch- 并发送到文件,Write-Host, toWrite-Output等——将默认值更改为您通常想要的值,并switch在显式设置的地方显式取消新参数。

等等等等。将所有呼叫路由到一个集中的票据交换所以便在 PowerShell 中输出要容易得多。然后,当您确实改变主意时,这并不是一项巨大的搜索和替换——然后替换回来——任务。

我认为这里唯一的痛苦是,如果您不想将东西发送到管道中,那么Write-Output就出局了,但确实想确保Write-Feedback写入的文件与您在示例中指定的文件相同> export.txt而无需编辑Write-Feedback每一次。我不确定是否有一种简单的方法可以做到这一点。

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

无论如何,最重要的是Write-Host通过在一个地方编辑来超载并做任何你想做的事情。

于 2015-02-06T16:13:02.637 回答
2

使用 *> 而不是 > 对我有用。它将所有输出重定向到一个文件;屏幕上不显示任何内容。

于 2020-11-16T22:22:32.250 回答