我正在尝试为我们拥有的应用程序编写一个基于 cmdlet 的 PowerShell 模块。在初始连接 cmdlet 之后,我想在用户打开当前 PowerShell 窗口时将值存储在某处。其中一个值是我根据用户凭据创建的身份验证密钥,以后调用时需要它,而无需为每个操作提供凭据。
我认为在 C# 的自定义对象中获取和设置这些可能很容易,但我正在努力让它应用于当前运行空间。我承认,我对 C# 也很陌生。
这是我以最小形式进行的最成功尝试的示例,即这将评估为真,但是,它不是相同的运行空间。如果我在 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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在 PowerShell 中编写这个模块,我可能只是将它们保存在一个全局变量中。任何人都可以帮助获取和设置这些值,以便我可以在 PowerShell 控制台中调用 item 吗?或者这是非常错误的,并且已经存在一些东西来解释我错过的 C# 中的持久模块范围变量。
假设您的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));
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在同一运行空间中运行的任何 cmdlet 都可以检索和读取变量:
[Cmdlet("Get", "Stuff")]
public class GetCmd : PSCmdlet
{
protected override void EndProcessing()
{
WriteObject(SessionState.PSVariable.Get("varName").Value);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,该Private选项不是可见性或范围修饰符,而是确保没有人可以覆盖变量值。