添加新成员时,阻止Add-Member cmdlet调用ScriptProperty成员

时间:2014-12-03 16:25:48

标签: powershell

我在PowerShell 5.0下测试Windows 10 Preview上的一些脚本时遇到过这种情况,但是我也可以在Win 8.1和PS4.0的某些机器上调用它(不是全部都是这样)。

基本上,在调用Add-Member cmdlet时,将调用该对象中的所有ScriptProperty成员,这在PS 2或3下不会发生。

执行此代码时:

$global:BaseObject = New-Object PSObject
$global:BaseObject | Add-Member ScriptProperty "Test" { Write-Warning "I shouldn't see this during next Add-Member call!" }
$global:BaseObject | Add-Member NoteProperty "Test2" 2

...您可以在上次Add-Member呼叫后看到登录到控制台的警告消息。

知道为什么会发生这种情况以及如何预防?或者为什么会在某些机器上发生这种情况,而不是在具有相同PowerShell版本的其他机器上发生?

更新

如下所述,这看起来像PowerShell中的一个错误。我能够发现它出现在PS 4以及PS 5预览中,如果您在版本6.3.9600.17400或更新版本中有System.Management.Automation.dll(由于某种原因,我们的一些8.1机器在6.3.9600.17090中有它工作正常)。我将向Microsoft提交一个错误。

1 个答案:

答案 0 :(得分:2)

我认为你正在犯一个错误。

使用V5预览,您可以通过实施以下[丑陋]解决方法来避免看到警告:

$WarningPreference = "SilentlyContinue"
$global:BaseObject = New-Object PSObject
$global:BaseObject | Add-Member ScriptProperty "Test" { Write-Warning "I shouldn't see this during next Add-Member call!" }
$global:BaseObject | Add-Member NoteProperty "Test2" 2
$WarningPreference = "Continue"

但是,当您调用对象$global:BaseObject

时,您将看到以下内容
WARNING: I shouldn't see this during next Add-Member call!
WARNING: I shouldn't see this during next Add-Member call!
WARNING: I shouldn't see this during next Add-Member call!
WARNING: I shouldn't see this during next Add-Member call!
WARNING: I shouldn't see this during next Add-Member call!

Test                                                                          Test2
----                                                                          -----
                                                                              2

$global:BaseObject.PsObject.methods显示4个方法,+ ScriptProperty,显示5个。 因此,似乎它正在为对象的每个方法调用ScriptProperty。

如果您现在调用$global:BaseObject.Test2警告将不会显示。

$global:BaseObject.Test2
2

如果你调用$global:BaseObject.Test警告就会出现。

希望这有助于某人进一步分析并提供更好的解决方案。