4

一些事实:

当您将一个对象分配给一个被调用的变量$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

我的问题:

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

4

2 回答 2

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总是在调用时更新。

于 2012-06-06T08:09:13.607 回答
3

为什么不直接创建一个函数?

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

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

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

于 2012-06-06T08:21:40.227 回答