如何在执行过程中将PowerShell的输出重定向到文件


198

我有一个PowerShell脚本,我想为其将输出重定向到文件。问题是我无法更改此脚本的调用方式。所以我不能做:

 .\MyScript.ps1 > output.txt

如何在执行过程中重定向PowerShell脚本的输出?

Answers:


192

也许Start-Transcript会为您工作。如果已经运行,请先停止它,然后启动它,完成后再停止它。

$ ErrorActionPreference =“ SilentlyContinue”
停止笔录| 零
$ ErrorActionPreference =“继续”
起始文字-路径C:\ output.txt-附加
#做些事
停止笔录

您还可以在处理内容时运行此程序,并保存命令行会话以供以后参考。

如果要在尝试停止未转录的笔录时完全消除错误,可以执行以下操作:

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

13
请注意,开始记录不会记录仅Write-Error,Write-Verbose或Write-Debug ...标准输出。
理查德·伯格

6
@richard:现在看来已经这样做了。也许这是2.0的补充,不确定这些答案是否都适用于1.0。
罗伯特·西亚乔

我在上面使用几乎相同的代码。我的问题是,如果未开始转录,Stop-Transcript | out-null仍会发送错误输出。我需要抑制该消息,因为它会弄乱我的布局。-erroraction默默地继续也无​​济于事。有任何想法吗?
梅尔

4
最后,我找到了Start-Transcript的文档。(令人沮丧的是没有用Powershell版本号标记)。它说: “脚本包含用户键入的所有命令以及控制台上显示的所有输出”。但是,我在Powershell 2.0中测试了Start-Transcript,发现@Richard是正确的,标准错误保存到脚本中。太烂了!
Panic Panic

如果您实际上有权写入指定的位置,则此方法似乎不会警告您。
demongolem

51

微软有 在Powershell的Connections网站(2012-02-15,下午4:40)上宣布,在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

1
并不是说我喜欢这种解决方案。实际上,我发现它很难看,很难记住且不灵活。好像将流捕获参数添加到Out-*,Set-Content和Add-Content Cmdlet一样,将以更强大的Powershelly方式完成任务。在使用它们的同时,还应该添加-PassThru参数。这将有效地使不那么有用的Tee-Object Cmdlet过时。
内森·哈特利

我很困惑,这如何回答所问的问题?“如何执行过程中重定向PowerShell脚本的输出?”
Zoredache

您是对的,@ Zoredache,我似乎忽略了“无法更改此脚本的调用方式”的要求。当捕获大部分输出时,Start-Transcript是解决之道。我应该删除这个答案吗?
内森·哈特利

1
对于那些来这里进行一般重定向的用户,Powershell从那时起增加了-OutVariable -WarningVariable -ErrorVariable,它可以直接回答我14年1月3日的评论。
内森·哈特利2013年

2
不,可以离开它。给定上投票的数量,这显然是有用的。几乎可以肯定,这个问题是从能够改变脚本调用方式的人们那里获得Google的好评。
Zoredache

36

用:

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

2
不能解决OP的问题,因为它在“执行期间”不起作用。但是我给它+1是因为知道无论如何如何在Powershell中管道都是有用的。
保罗·马斯里-斯通

28

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

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

我刚刚在PowerShell 3中进行了尝试。您可以像Nathan Hartley的答案一样使用所有重定向选项。


我喜欢这个解决方案。您可以使用>> output.txt进行追加。有人知道是否有一种方法可以使此创建ascii而不是unicode吗?
冯·莱蒙加格尔教授2016年

1
您可以尝试执行以下操作:*>&1 | Out-File $log -Encoding ascii -Append -Width 132但是,如果需要精确控制输出,Powershell确实很丑陋。
mplwork

我喜欢它,因为它可以在您的脚本中使用。非常适合流浪汉。
user3505901

25

如果您的情况允许,一种可能的解决方案:

  1. 将MyScript.ps1重命名为TheRealMyScript.ps1
  2. 创建一个新的MyScript.ps1,如下所示:

    。\ TheRealMyScript.ps1> output.txt


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

1
这是适用于我的脚本输出的众多选项中的唯一选项。
cori


16

如果要将所有输出直接重定向到文件,请尝试使用*>>

# 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上进行测试。


4

如果要从命令行执行而不是脚本本身内置,请使用:

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

7
询问者明确解释了脚本调用不能更改。
2014年

2
无关紧要的问题,但对我有帮助,我正在谷歌搜索以正确的语法与管道到文件外。
gReX

0

要将其嵌入到脚本中,可以这样进行:

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

这应该够了吧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.