首页 > 解决方案 > 如何在当前运行空间中获取和设置变量?(基于 cmdlet 的模块)

问题描述

我正在尝试为我们拥有的应用程序编写一个基于 cmdlet 的 PowerShell 模块。在初始连接 cmdlet 之后,我想在用户打开当前 PowerShell 窗口时将值存储在某处。其中一个值是我从用户的凭据创建的身份验证密钥,然后是未来调用所必需的,而无需为每个操作提供凭据。

我认为在 C# 的自定义对象中获取和设置这些可能很容易,但我正在努力让它应用于当前的运行空间。我承认,我对 C# 也很陌生。

这是我以最小形式进行的最成功尝试的示例,即这将评估为 true,但是,它不是相同的运行空间。如果我在 PowerShell 中调用 $item,它显然不知道我在做什么。

using System.Management.Automation.Runspaces;

namespace Test
{
    public class VariableTest
    {
        public bool CreateVariable()
        {
            var runSpace = RunspaceFactory.CreateRunspace();
            runSpace.Open();

            runSpace.SessionStateProxy.SetVariable("item", "FooBar");
            var a = runSpace.SessionStateProxy.PSVariable.GetValue("item");

            if (a.ToString() == "FooBar")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

如果我在 PowerShell 中编写这个模块,我可能只是将它们保存在一个全局变量中。任何人都可以帮助获取和设置这些值,以便我可以在 PowerShell 控制台中调用 item 吗?或者这是非常错误的,并且已经存在一些东西来解释我错过的 C# 中的持久模块范围的变量。

标签: c#powershell

解决方案


假设您的Connect-*cmdlet 继承PSCmdlet,您可以通过以下方式访问变量this.SessionState.PSVariable

[Cmdlet("Connect", "SomeSystem")]
public class ConnectCmd : PSCmdlet
{
    protected override void EndProcessing()
    {
        SessionState.PSVariable.Set(new PSVariable("varName", valueGoesHere, ScopedItemOptions.Private));
    }
}

现在,在同一运行空间中运行的任何 cmdlet 都可以检索和读取该变量:

[Cmdlet("Get", "Stuff")]
public class GetCmd : PSCmdlet
{
    protected override void EndProcessing()
    {
        WriteObject(SessionState.PSVariable.Get("varName").Value);
    }
}

请注意,该Private选项不是可见性或范围修饰符,而是确保没有人可以覆盖变量值。


推荐阅读