如何将PowerShell的输出重定向到执行期间的文件

我有一个PowerShell脚本,我想将输出重定向到一个文件。问题是我不能改变这个脚本的调用方式。所以我不能:

 .\MyScript.ps1 > output.txt

如何重定向PowerShell脚本执行期间的输出?

723887 次浏览

如果你的情况允许,有一个可能的解决方案:

  1. 重命名MyScript。ps1到TheRealMyScript.ps1
  2. 创建一个新的MyScript。Ps1看起来像:

    \ TheRealMyScript。Ps1 > output.txt

    .txt

也许Start-Transcript适合你。如果它已经在运行,首先停止它,然后启动它,完成时停止它。

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path C:\output.txt -append
# Do some stuff
Stop-Transcript

你也可以让它在工作时运行,并让它保存你的命令行会话以供以后参考。

如果你想在试图停止一个没有转录的转录时完全抑制错误,你可以这样做:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

你可能想看看cmdlet Tee-Object。您可以将输出管道到Tee,它将写入管道和文件

微软已经在Powershell的连接网站上宣布(2012-02-15 at 4:40 PM),在3.0版本中,他们已经扩展了重定向作为这个问题的解决方案。

In PowerShell 3.0, we've extended output redirection to include the following streams:
Pipeline (1)
Error    (2)
Warning  (3)
Verbose  (4)
Debug    (5)
All      (*)


We still use the same operators
>    Redirect to a file and replace contents
>>   Redirect to a file and append to existing content
>&1  Merge with pipeline output

有关详细信息和示例,请参阅“about_Redirection”帮助文章。

help about_Redirection

使用:

Write "Stuff to write" | Out-File Outputfile.txt -Append

如果你想从命令行执行,而不是内置到脚本本身,使用:

.\myscript.ps1 | Out-File c:\output.csv

要在你的脚本中嵌入它,你可以这样做:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

这样应该可以了。

我认为你可以修改MyScript.ps1。然后试着像这样改变它:

$(
Here is your current script
) *>&1 > output.txt

我刚刚用PowerShell 3试了一下。你可以像内森·哈特利的回答一样使用所有重定向选项。

如果你想直接将所有输出重定向到一个文件,尝试使用*>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

因为这是一个直接重定向到文件,它不会输出到控制台(通常很有用)。如果你想要控制台输出,用*&>1组合所有输出,然后用Tee-Object管道:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;


# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

我相信PowerShell 3.0或更高版本支持这些技术;我正在PowerShell 5.0上测试。

powershell ".\MyScript.ps1" > test.log