script
命令的方法:
这是基于这个答案的。
另外,通过将这种方法与 terminal-to-html
结合使用:
我能够将任意颜色的PowerShell输出渲染为HTML。
自 Powershell 7.2 开始应该是可能的,因为它支持 ANSI 颜色。感谢先前的答案。
至于一个例子(Powershell 7.3.3 / MacOS,具体情况可能会有所不同):
$PsStyle.OutputRending = "Ansi"
$s = Get-ChildItem | Select -First 3 | Out-String
Set-Content -path foo.txt $s
Get-Content ./foo.txt # prints out colored output
vi
这样的工具来检查文件,会显示出 Ansi 颜色代码。...
^[[32;1mUnixMode User Group LastWriteTime Size Name^[[0m
^[[32;1m-------- - ----- ------------- ---- ----^[[0m
...
Write-Host 'abc' -ForegroundColor Red
让它工作吗? - dharmatechWrite-Host
会显示ANSI控制码吗?还是说Write-Host
写的内容也应该带有颜色并保存到文件中? - vonPryzGet-ChildItem
。你能否使用上面展示的Write-Host
使你的示例运行起来? - dharmatechWrite-Host
而不是Get-ChildItem
来采用你的方法时,红色并没有显示出来。 - dharmatechWrite-Host abc -ForegroundColor red
。当我使用您的方法处理这个示例时,转义字符似乎没有显示出来。 - dharmatechWrite-Host
将 InformationRecord 对象写入 信息流。如果使用 6>&1
将信息流重定向到成功流,则会显示该信息。$InformationRecord = Write-Host abc -ForegroundColor Red 6>&1
$InformationRecord | Get-Member
TypeName: System.Management.Automation.InformationRecord
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Computer Property string Computer {get;set;}
ManagedThreadId Property uint ManagedThreadId {get;set;}
MessageData Property System.Object MessageData {get;}
NativeThreadId Property uint NativeThreadId {get;set;}
ProcessId Property uint ProcessId {get;set;}
Source Property string Source {get;set;}
Tags Property System.Collections.Generic.List[string] Tags {get;}
TimeGenerated Property datetime TimeGenerated {get;set;}
User Property string User {get;set;}
MessageData
属性中保存颜色信息,本身不包含任何ANSI控制码。$InformationRecord.MessageData | Get-Member
TypeName: System.Management.Automation.HostInformationMessage
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
BackgroundColor Property System.Nullable[System.ConsoleColor] BackgroundColor {get;set;}
ForegroundColor Property System.Nullable[System.ConsoleColor] ForegroundColor {get;set;}
Message Property string Message {get;set;}
NoNewLine Property System.Nullable[bool] NoNewLine {get;set;}
Write-Host
的ANSI控制代码。参见:在PowerShell命令输出中是否有保留ANSI控制代码的方法?
你可以考虑编写自己的Write-Ansi
代理命令,基于Write-Host
,但使用Write-Host
命令存在一个普遍的缺点,即只能为整个输出使用单一颜色,这需要使用-NoNewLine
开关,并在任何代理命令中考虑到这一点。Write-Host 'This whole line is red.' -ForegroundColor Red
$PSStyle
对象: "This is $($PSStyle.Foreground.Red)red$($PSStyle.Reset) text" # > .\out.txt
'Make this *blue* text' > .\out.txt
(Get-Content .\out.txt | ConvertFrom-MarkDown -AsVT100EncodedString).VT100EncodedString
甚至可以是:Set-MarkdownOption -ItalicsForegroundColor '[91m'
('Make this *red* text' | ConvertFrom-MarkDown -AsVT100EncodedString).VT100EncodedString > .\out.txt
Get-Content .\out.txt
ConvertFrom-MarkDown
这个命令。我之前主要使用的是 PowerShell 5.1 版本,现在开始使用 7.3 版本。谢谢你,iRon! - dharmatech
script
可用的情况下。所以如果有更便携的方法,我会很感兴趣! - dharmatech