代码之家  ›  专栏  ›  技术社区  ›  esac

是否可以创建自己的“自动变量”?

  •  6
  • esac  · 技术社区  · 15 年前

    我基本上想创建一个每次都要执行的变量。最简单的例子是:

    $myvar = `write-host foo`;
    

    然后每次我引用$myvar时,它都会输出foo:

    dir $myvar
    
    Directory of foo:
    

    关键是 write-host foo 每次我引用$myvar时都会重新执行部分

    3 回复  |  直到 15 年前
        1
  •  5
  •   x0n    15 年前

    通过创建自己的psvariable派生类,它可以在托管代码(c/vb)中实现,但不能直接在纯脚本中实现,抱歉。我说的是“纯脚本”,因为在PowerShell v2中,您可以使用添加类型内联C。也就是说,您可以通过隐式ToString调用在脚本中对其进行黑客攻击,但这在任何情况下都不可靠。例子:

    # empty custom object
    $o = new-object psobject
    
    # override ToString with a PSScriptMethod member
    $o.psobject.members.add((new-object `
         System.Management.Automation.PSScriptMethod "ToString", {
             "ticks: $([datetime]::now.ticks)" }))
    
    ps> $o
    ticks: 634256043148813794
    
    ps> $o
    ticks: 634256043165574752
    

    注意,每个变量的计算中的刻度计数是不同的。当然,如果只使用正则函数而不是变量,那么这就容易得多。

    function Ticks { [datetime]::now.ticks }
    
    # use as a parameter - note the use of ( and )
    ps> write-host (ticks)
    634256043148813794
    
    # use in a string - note the use of $( and )
    ps> write-host "ticks $(ticks)"
    ticks 634256043165574752
    

    希望这有帮助

    -奥辛

        2
  •  2
  •   Jaykul    15 年前

    另一种简单的方法是在prompt函数中强制重新计算,以便每次命令完成并显示提示时更新变量:

    $MySecretOldPromptStorage = ${Function:Prompt}
    function prompt { $o = $([datetime]::now.ticks); &$MySecretOldPromptStorage }
    

    当然,这会导致它每次都运行,而不是按需运行

        3
  •  2
  •   Roman Kuzmin    15 年前

    完成@X0n提到的任务并不难。我们可以在代码中嵌入一段C,得到一个真正的自动变量:

    # define a class of my variable, override the Value property
    Add-Type @'
    using System;
    using System.Management.Automation;
    public class MyVariable : PSVariable
    {
        public MyVariable(string name) : base(name) {}
        public override object Value
        {
            get { return DateTime.Now.Ticks; }
            set { }
        }
    }
    '@
    
    # install the variable
    $ExecutionContext.SessionState.PSVariable.Set((New-Object MyVariable Ticks))
    
    # test
    $Ticks
    sleep 1
    $Ticks
    sleep 1
    $Ticks
    

    关于 PSVariable :

    http://msdn.microsoft.com/en-us/library/system.management.automation.psvariable

    推荐文章