c# - 如何在当前运行空间中获取和设置变量?(基于 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# 中的持久模块范围的变量。
解决方案
假设您的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
选项不是可见性或范围修饰符,而是确保没有人可以覆盖变量值。
推荐阅读
- transactions - Quarkus 事务如何与反应式 sql 客户端一起工作
- swagger - 我需要在 springdoc-openapi 中为 @Parameter 添加多个示例,但这不会生成给定的示例
- python - 枚举从列表返回多个索引作为整数
- node.js - How to create an endpoint in Sequelize.js that receives any random JSON in the model?
- aws-lambda - Lambda 在 3 秒后超时
- r-markdown - 如何使用 Rmarkdown 解释 yaml 错误消息?
- selenium-chromedriver - 查找使用的 Chrome 驱动程序版本
- ngrx - 测试 ngrx 商店:MockStore 没有提供者
- time-complexity - 由递归 T(n) = 2T(n-1) + 1 给出的递归算法的时间复杂度是多少
- python - Python SQLite3 两个程序可以同时访问同一个数据库吗?