我在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提交一个错误。
答案 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
警告就会出现。
希望这有助于某人进一步分析并提供更好的解决方案。