2014-12-03 74 views
2

我在PowerShell 5.0下測試Windows 10 Preview上的某些腳本時碰到過這個問題,但我也能夠在一些使用Win 8.1和PS4的機器上調用它。 0(不是所有的都是)。阻止添加成員cmdlet在添加新成員時調用ScriptProperty成員

基本上調用添加會員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 

...您可以在最後一次添加成員呼叫後看到登錄到控制檯的警告消息。

任何想法爲什麼會發生這種情況,以及如何防止它?或者爲什麼這確實發生在某些機器上,而沒有發生在具有相同PowerShell版本的其他機器上?

更新:

如低於此提到看起來像在PowerShell中的錯誤。我能夠發現它出現在PS 4以及PS 5預覽版中,如果您的System.Management.Automation.dll版本爲6.3.9600.17400或更新版本(由於某些原因,我們的某些8.1版機器在6.3.9600.17090版本中擁有它工作正常)。我會向微軟提交一個錯誤。

+1

當你使用'Add-Member'時,你是否看到了結果對象,好像你用'-PassThru'調用了它?您發佈的代碼是您正在運行的實際代碼嗎?在PS4中,我無法在ISE中或控制檯主機中重現。 – briantist 2014-12-03 16:36:42

+0

猜測的位,但它是否只是在每次操作後返回對象?如果你管到「Out-Null」,它還會發生嗎? – arco444 2014-12-03 16:42:09

+0

@briantist我沒有使用-PassThru,使用它實際上調用了scriptproperty 6次:) – 2014-12-03 17:13:29

回答

2

我認爲你正在碰到一個bug。

使用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,則會顯示警告。

希望這可以幫助某人進一步分析並提供更好的修復。