如何传播-详细到模块功能?

sti*_*ijn 3 powershell cmdlets

根据回答这样一个和我自己的经验,PowerShell的可以照顾传播-Verbose(和-Debug)自动,这是非常方便的。但是,当我要传播冗长的功能在模块中时,此操作停止。用于测试此代码:

在名为Modc:的目录中创建一个目录,并添加2个文件:

档案c:\Mod\Functions.ps1

function Show-VerbosityB { [cmdletbinding()]Param()
  Write-Output "Show-VerbosityB called"
  Write-Verbose "Show-VerbosityB is Verbose"
}
Run Code Online (Sandbox Code Playgroud)

档案c:\Mod\Mod.psd1

@{
ModuleVersion = '1.0.0.0'
NestedModules = @('Functions.ps1')
FunctionsToExport = @('*-*')
}
Run Code Online (Sandbox Code Playgroud)

现在创建主脚本,说c:\Foo.ps1

Import-Module c:\Mod

function Show-VerbosityA { [cmdletbinding()]Param()
  Write-Output "Show-VerbosityA called"
  Write-Verbose "Show-VerbosityA is Verbose"
}

function Show-Verbosity { [cmdletbinding()]Param()
  Write-Output "Show-Verbosity called"
  Write-Verbose "Show-Verbosity is Verbose"
  Write-Output "Testing propagation"
  Show-VerbosityA
  Show-VerbosityB
}

Show-Verbosity -Verbose
Run Code Online (Sandbox Code Playgroud)

结果是

PS> . C:\Foo.ps1
Show-Verbosity called
VERBOSE: Show-Verbosity is Verbose
Testing propagation
Show-VerbosityA called
VERBOSE: Show-VerbosityA is Verbose
Show-VerbosityB called
Run Code Online (Sandbox Code Playgroud)

为什么跳过模块功能中的写入详细信息,为什么传播行为不如Show-VerbosityA那样?(如果我只是点源Functions.ps1而不是导入模块,则将VERBOSE: Show-VerbosityB is Verbose打印该行)。我可以通过例如致电来制作传播手册Show-VerbosityB -Verbose:$PSBoundParameters['Verbose']。还是有其他方法,最好是更短方法?如果函数的行为取决于模块的一部分还是点源的,它们的行为将非常混乱。

gms*_*man 6

发生这种情况的原因$VerbosePreference是,在调用模块时不会传播。我修改了脚本,以在通过Write-Verbose和输出的同一点显式打印该值Write-Output

这篇powershell.org帖子建议将其添加到模块中,这对我来说就像一个魅力:

if (-not $PSBoundParameters.ContainsKey('Verbose'))
{
    $VerbosePreference = $PSCmdlet.GetVariableValue('VerbosePreference')
}
Run Code Online (Sandbox Code Playgroud)

评论之一提到带有链接的错误报告(该链接不存在,或者我没有查看权限)

这个问题是在后的TechNet讨论,有一个链接到一个Get-CallerPreferance功能是解决此问题。


模块:

function Show-VerbosityB { [cmdletbinding()]Param()

    <# uncomment to get verbose preference from caller, when verbose switch not explicitly used.
    if (-not $PSBoundParameters.ContainsKey('Verbose'))
    {
        $VerbosePreference = $PSCmdlet.GetVariableValue('VerbosePreference')
    }
    #>

    Write-Output "`nShow-VerbosityB called"
    Write-output "Global pref: $($global:VerbosePreference)"
    Write-output "Script pref: $($script:VerbosePreference)"
    Write-output "Effect pref: $VerbosePreference"
    Write-Verbose "Show-VerbosityB is Verbose"
}
Run Code Online (Sandbox Code Playgroud)

呼叫者:

Import-Module C:\Mod

Write-output "On startup: $VerbosePreference"

function Show-VerbosityA { [cmdletbinding()]Param()
  Write-Output "`nShow-VerbosityA called"
  Write-output "Global pref: $($global:VerbosePreference)"
  Write-output "Script pref: $($script:VerbosePreference)"
  Write-output "Effect pref: $VerbosePreference"
  Write-Verbose "Show-VerbosityA is Verbose"
}

function Show-Verbosity { [cmdletbinding()]Param()
  Write-Output "`nShow-Verbosity called"
  Write-output "Global pref: $($global:VerbosePreference)"
  Write-output "Script pref: $($script:VerbosePreference)"
  Write-output "Effect pref: $VerbosePreference"
  Write-Verbose "Show-Verbosity is Verbose"
  Write-Output "`nTesting propagation"
  Show-VerbosityA
  Show-VerbosityB
}

Show-Verbosity -Verbose
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这确实是答案。不幸的是,并非完全符合我的期望:]修改每个函数来处理这是疯狂的,因此,如果我需要所有的冗长性,我可能只会诉诸于`$ global:VerbosePreference = [System.Management.Automation.ActionPreference]之类的东西。 ::继续`.. (2认同)