Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PowerShell: How To Create A Reference on Object Propertys

Some Facts:

When you asign an object to a variable called $a and then one of it's propertys changes, the variable $a gets updated.

But when I asign the value of an object's property $object.property (instead of the object itself) to the variable called $b and then $object.property changes, $b doesn't get updated. That means, the current value is stored in $object.property, but $b stays the way it is.

An example:

I asign an Window object to a variable called $bochsWindow. Then some propertys change because I move the window. But when I print out $bochsWindow, you can see that it's up to date - that means, all new values of the object's propertys are also stored in $bochsWindow.

But if try to store a property of $bochsWindow in a variable called $posX and then the property changes, $posX doesn't change.

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 .>

But what should I do if I want $posX to stay up to date and always store the new value (472) instead of 302

My Question:

I want to store a reference the an object's property in a variable. That means, I want the variable to get updated every time the object's property changes. How can I do this? Thanks.

like image 483
fridojet Avatar asked Jan 16 '23 11:01

fridojet


1 Answers

Not trivial way using PSBreakpoint, but it's the only that I know:

$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

In this way $b is always updated when called.

like image 95
CB. Avatar answered Jan 28 '23 17:01

CB.