ChatGPT解决这个技术问题 Extra ChatGPT

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

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

 .\MyScript.ps1 > output.txt

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

正如@Nathan 在他的回答中提到的那样,如果您使用的是 Powershell 3.0 或更高版本,那么这应该可以工作。检查:stackoverflow.com/a/2916392/3197387

P
Peter Mortensen

也许 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"

请注意,start-transcript 不记录 Write-Error、Write-Verbose 或 Write-Debug...仅标准输出。
@richard:现在似乎这样做了。也许这是 2.0 的补充,不确定这些答案是否都适用于 1.0。
我正在使用上面几乎相同的代码。我的问题是,如果没有开始转录,Stop-Transcript |out-null 仍然会发送错误输出。我需要抑制消息,因为它弄乱了我的布局。 -erroraction quietlycontinue 也无济于事。有任何想法吗?
最后,我找到了 Start-Transcript 的文档。 (令人沮丧的是没有标有 Powershell 版本号)。它“脚本包括用户键入的所有命令和控制台上显示的所有输出”。但是,我在 Powershell 2.0 中测试了 Start-Transcript,发现 @Richard 是对的,标准错误 isn't 保存到了脚本中。这糟透了!
如果您实际上有权写入指定的位置,此方法似乎不会警告您。
P
Peter Mortensen

Microsoft announced on Powershell's Connections web site (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

并不是说我喜欢这个解决方案。事实上,我觉得它丑陋、难以记忆且不灵活。似乎将流捕获参数添加到 Out-*、Set-Content 和 Add-Content Cmdlet 会以更 Powershelly 的方式完成。当他们使用它时,他们还应该添加一个 -PassThru 参数。这将有效地使不太有用的 Tee-Object Cmdlet 过时。
我很困惑,这如何回答所提出的问题? “如何在执行期间重定向 PowerShell 脚本的输出”?
你是对的,@Zoredache,我似乎忽略了“不能改变调用这个脚本的方式”的要求。当捕获大部分输出时,Start-Transcript 是要走的路。我应该删除这个答案吗?
对于那些来这里进行一般重定向的人,Powershell 已经添加了 -OutVariable -WarningVariable -ErrorVariable ,它直接回答了我 14 年 1 月 3 日的评论。
不,离开它很好。鉴于赞成票的数量,它显然是有用的。这个问题几乎肯定会从能够改变脚本调用方式的人那里获得谷歌点击率。
P
Peter Mortensen

利用:

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

不能解决 OP 的问题,因为它在“执行期间”不起作用。但是我给了它+1,因为无论如何知道如何在Powershell中进行管道传输很有用。
这会截断长行输出并删除信息
P
Peter Mortensen

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

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

我刚刚使用 PowerShell 3 进行了尝试。您可以使用 Nathan Hartley's answer 中的所有重定向选项。


我喜欢这个解决方案。您可以使用 >> output.txt 追加。任何人都知道是否有办法让这个创建 ascii 而不是 unicode?
您可以尝试这样的操作:*>&1 | Out-File $log -Encoding ascii -Append -Width 132 但如果您需要精确控制输出,Powershell 真的很难看。
我更喜欢这个,因为它在你的脚本中工作。非常适合流浪者。
s
suiwenfeng
powershell ".\MyScript.ps1" > test.log

这是适用于我的脚本输出的众多选项中唯一的一个。
z
zdan

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

将 MyScript.ps1 重命名为 TheRealMyScript.ps1 创建一个新的 MyScript.ps1,如下所示: .\TheRealMyScript.ps1 > output.txt


P
Peter Mortensen

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

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


A
Andy Schneider

您可能需要查看 cmdlet Tee-Object。您可以将输出通过管道传输到 Tee,它将写入管道以及文件


“输出” |设置内容-PassThru 和“输出” | Add-Content -PassThru 也可以像 Tee-Object 一样工作,另外还有一个好处是您可以设置编码。
P
Peter Mortensen

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

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

提问者明确解释不能更改脚本调用。
与问题无关,但对我有帮助,我正在谷歌搜索以使用 Pipe to Out-File 获得正确的语法。
P
Peter Mortensen

要将其嵌入到您的脚本中,您可以这样做:

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

这应该够了吧。