gpt4 book ai didi

oop - 重载内置函数,如 Write-Verbose

转载 作者:行者123 更新时间:2023-12-02 23:43:01 26 4
gpt4 key购买 nike

我刚刚了解到使用 Write-Verbose 的好处& Write-Debug超过我自己的Write-Log功能,您可以在下面找到:

Function Write-Log 
{
param($logType, $logString, $logFile, [switch]$newLine)

$time = get-date -Format "HH:mm:ss"
$date = get-date -Format "yyyy-MM-dd"
$line = "[${date}][${time}][$logType] ${logString}"

if ($logFile)
{
$retryDelay = 0.5;
$maxRetries = 10;
$retries = 0;

while($retries -lt $maxRetries)
{
try
{
$line | out-file -Encoding utf8 -Append $logFile
break;
}
catch
{
++$retries;
Sleep $retryDelay;
}
}
}

if ($logType -eq 'INFO')
{
write-host -ForegroundColor Green $line
}
elseif ($logType -eq 'WARN')
{
write-host -ForegroundColor Yellow $line
}
elseif ($logType -eq 'ERROR')
{
write-host -ForegroundColor Red $line
}

if ($newLine -eq $true)
{
write-host
}
}

这有助于我使我的脚本输出尽可能地简洁,并包含一个在调试时很方便的时间戳。

问题

有没有办法重载 Write-Verbose所以它的行为如下?
PS > Write-Verbose -Message 'I am a verbose message!' 

[2016-02-25][07:44:36] VERBOSE: I am a verbose message!

编辑

我发现了以下内容,不幸的是,这不符合 $VerbosePreference多变的:
$VerbosePreference = "SilentlyContinue"

Function Private:Write-Verbose ($Message)
{
$time = get-date -Format "HH:mm:ss"
$date = get-date -Format "yyyy-MM-dd"
$line = "[${date}][${time}] "

Write-Host $line -NoNewline

&{Write-Verbose -Message $Message}

}

Write-Verbose -Message "Test"

以上将只输出日期和时间戳,没有消息。

最佳答案

Write-Verbose 位于 Microsoft.PowerShell.Utility 中,因此这是不可能的;无需操作和更改 Powershell 中的内置行为(应避免)。

您可以在脚本/ session 范围内创建自己的“Write-Verbose”函数;这将输出所需的结果(使用 cmdletbinding());或使用诸如“VERBOSE:[2016-02-25][07:44:36] 您的日志消息”之类的输出消息(依赖于 write-verbose 的默认行为)。

除非您对主机有一些时髦的输出要求,否则我会推荐后者。

如果您继续创建自己的 Write-Verbose 函数,则应在参数之前使用 [cmdletbinding()];因为这可以将默认参数/开关传递给您的函数(例如 -verbose/-information、-debug 等)。
有关 cmdletbinding 和参数绑定(bind)的详细信息,请参阅:

https://blogs.technet.microsoft.com/heyscriptingguy/2012/07/07/weekend-scripter-cmdletbinding-attribute-simplifies-powershell-functions/

https://posh2scripting.wordpress.com/2013/06/05/what-is-cmdletbinding/

最后一件事;不建议直接在脚本中使用 Write-host,因为这会与默认流重定向(等)混淆。如果您要将信息打印到流中,我强烈建议您使用 Write-Verbose、Write-Debug、Write-information、Write-Output cmdlet。

有关不使用 Write-host 的更多信息,请访问:

http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

http://powershell.com/cs/blogs/donjones/archive/2012/04/06/2012-scripting-games-commentary-stop-using-write-host.aspx

希望这能回答你的问题。

关于oop - 重载内置函数,如 Write-Verbose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35620301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com