根据这个答案和我的经验,PowerShell可以自动传播-Verbose(和-Debug),这非常方便。但是,当我想要传播详细信息的函数在模块中时,它就不起作用了。用于测试的代码如下:
创建一个名为
文件
现在创建主脚本,命名为
模块函数中的Write-Verbose为什么被跳过了?为什么传播行为不像Show-VerbosityA那样?(如果我只是用点运算符引用Functions.ps1,那么
创建一个名为
Mod
的目录,在c:中添加2个文件:文件
c:\Mod\Functions.ps1
:function Show-VerbosityB { [cmdletbinding()]Param()
Write-Output "Show-VerbosityB called"
Write-Verbose "Show-VerbosityB is Verbose"
}
文件 c:\Mod\Mod.psd1
:
@{
ModuleVersion = '1.0.0.0'
NestedModules = @('Functions.ps1')
FunctionsToExport = @('*-*')
}
现在创建主脚本,命名为
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
结果在
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
模块函数中的Write-Verbose为什么被跳过了?为什么传播行为不像Show-VerbosityA那样?(如果我只是用点运算符引用Functions.ps1,那么
VERBOSE: Show-VerbosityB is Verbose
这一行就会被打印出来)。我可以通过手动调用Show-VerbosityB -Verbose:$PSBoundParameters['Verbose']
等方式进行传递。或者是否有其他更短的方法?如果函数行为因为是模块的一部分而与直接引用有所不同,那么这就非常混乱。
$global:VerbosePreference = [System.Management.Automation.ActionPreference] :: Continue
的东西。 - stijnGet-CallerPreferance
函数只需要一行代码。对我来说,让我的模块函数像内置的 cmdlet 一样运行,而无需在调用方担心,则是值得的。 - zett42VerbosePrefreence
、DebugPreference
和WhatIfPreference
这样的东西可能无法在不同 脚本 模块中的函数之间正确传播。 微软已经意识到这个问题,并且一直在尝试修复这种不一致的行为。 - fourpastmidnight