PowerShell:如何在对象属性上创建引用

时间:2012-06-06 05:47:32

标签: shell pointers powershell command-line reference

一些事实:

当您将对象与一个名为$a的变量对齐,然后其中一个属性发生变化时,变量$a会更新。

但是当我将对象的属性 $object.property(而不是对象本身)的值设置为名为$b的变量然后$object.property更改时, $b未获得更新。这意味着,当前值存储在$object.property中,但$b保持原样。

一个例子:

我将Window对象设置为名为$bochsWindow的变量。然后一些属性改变,因为我移动窗口。但是当我打印出$bochsWindow时,您可以看到它是最新的 - 也就是说,对象属性的所有新值也存储在$bochsWindow中。

但是,如果尝试将$bochsWindow的属性存储在名为$posX的变量中,然后属性发生更改,则$posX不会更改。

PS .> $bochsWindow = (GetProcess bochs | Get-Window)
PS .> $bochsWindow


ProcessId    : 1536
ProcessName  : bochs
Position     : {X=54,Y=32,Width=650,Height=576}
IsMinimized  : False
IsMaximized  : False
WindowHandle : 3933134
Caption      : Bochs for Windows - Display


[[Moving Boch's Window By Hand]]
PS .> $bochsWindow


ProcessId    : 1536
ProcessName  : bochs
Position     : {X=0,Y=0,Width=650,Height=576}
IsMinimized  : False
IsMaximized  : False
WindowHandle : 3933134
Caption      : Bochs for Windows - Display


PS .> (Get-Window -ProcessName bochs)


ProcessId    : 1536
ProcessName  : bochs
Position     : {X=0,Y=0,Width=650,Height=576}
IsMinimized  : False
IsMaximized  : False
WindowHandle : 3933134
Caption      : Bochs for Windows - Display



PS .> $posX = $bochsWindow.Position.X
PS .> $posX
302
[[Moving Boch's Window By Hand]]
PS .> $posX
302
PS .> $bochsWindow.Position.X
472
PS .>

但如果我希望$posX保持最新并始终存储新值(472)而不是302

,该怎么办?

我的问题:

我想在变量中存储对象属性的引用。这意味着,我希望每次对象的属性更改时都会更新变量。我怎样才能做到这一点?感谢。

2 个答案:

答案 0 :(得分:6)

使用PSBreakpoint并非琐碎的方法,但这是我所知道的唯一方法:

$global:bochsWindow = (GetProcess bochs | Get-Window) 
$act= @'
$global:b = $bochsWindow.Position.X 
'@
$global:sb = [scriptblock]::Create($act)
$global:b = Set-PSBreakpoint -Variable b -Mode Read -Action $global:sb

这样,$b在调用时始终会更新。

答案 1 :(得分:3)

为什么不创建一个函数?

function posX(){ $bochsWindow.Position.X }

然后将其用作posX。替代方案是脚本块。

除此之外,我没有看到这样做的简单方法。