【问题标题】:PowerShell: How To Create A Reference on Object PropertysPowerShell:如何创建对象属性的引用
【发布时间】:2012-06-10 03:31:39
【问题描述】:

一些事实:

当您将对象分配给名为 $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,我该怎么办

我的问题:

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

【问题讨论】:

    标签: shell pointers powershell command-line reference


    【解决方案1】:

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

    【讨论】:

    • 你为什么总是在变量名前面写$global:。这是否意味着您的 Breakpoint 方法只能用于全局变量?
    • @fridojet 因为变量也必须存在于脚本块中。否则将被评估为脚本块中的新变量。
    • 但是:如果我只想单独使用脚本块内的变量,是否可以省略global:
    • @fridojet 所有变量都在这里的脚本块中使用。您可以省略 $global 最后一个 $global:b = set-break.... 和 -Action $global:sb 因为之前已声明为全局。没办法!
    • @fridojet 如果 $b 变量仅在脚本块代码中使用,则可以省略 $global。尝试阅读get-help about_scopes 了解更多信息。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 2012-03-13
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多