PowerShell:如何在对象属性上创建引用 一些事实:

PowerShell:如何在对象属性上创建引用 一些事实:,shell,pointers,powershell,command-line,reference,Shell,Pointers,Powershell,Command Line,Reference,当您将一个对象指定给名为$a的变量,然后它的一个属性发生更改时,变量$a将更新 但是,当我将对象的属性值$object.property(而不是对象本身)分配给名为$b的变量,然后$object.property更改时,$b不会得到更新。这意味着,当前值存储在$object.property中,但$b保持原样 例如: 我将窗口对象指定给名为$bochsWindow的变量。然后一些属性会因为我移动窗口而改变。但是当我打印出$bochsWindow时,您可以看到它是最新的-这意味着,对象属性的所有新

当您将一个对象指定给名为
$a
的变量,然后它的一个属性发生更改时,变量
$a
将更新

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

例如: 我将
窗口
对象指定给名为
$bochsWindow
的变量。然后一些属性会因为我移动窗口而改变。但是当我打印出
$bochsWindow
时,您可以看到它是最新的-这意味着,对象属性的所有新值也存储在
$bochsWindow

但是,如果尝试在名为
$posX
的变量中存储
$bochsWindow
的属性,然后该属性发生更改,
$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
,我该怎么办

我的问题:
我想将对象属性的引用存储在变量中。这意味着,我希望变量在对象的属性每次更改时都得到更新。我该怎么做?谢谢。

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

为什么不创建一个函数呢

function posX(){ $bochsWindow.Position.X }
然后将其用作
posX
。另一种选择是脚本块


除此之外,我没有看到一个简单的方法来做这件事

为什么总是在变量名称前面写
$global:
。这是否意味着断点方法只能在全局变量上使用?@fridojet,因为变量也必须存在于scriptblock中。否则将作为scriptblock中的新变量进行计算。但是:如果我只想单独使用scriptblock中的变量,是否可以省略
全局:
?@fridojet所有变量都在scriptblock中使用。您可以在最后一个$global:b=设置中断时忽略$global。。。。和-Action$global:sb,因为它们以前被声明为全局的。别无选择@fridojet如果$b变量仅在脚本块代码中使用,则可以省略$global。有关更多信息,请尝试阅读
获取有关\u作用域的帮助。