Как я могу получить и установить переменные в текущем пространстве выполнения? (модули на основе командлетов) - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь написать модуль PowerShell на основе командлетов для нашего приложения.После исходного командлета подключения я хочу сохранить значения где-нибудь, пока у пользователя открыто текущее окно PowerShell.Одним из значений является ключ авторизации, который я создаю из учетных данных пользователя, а затем он требуется для будущих вызовов без предоставления учетных данных для каждого действия.

Я подумал, что было бы легко получить и установить их в пользовательскомобъект из C #, но я изо всех сил пытаюсь заставить его применить к текущему пространству выполнения.Я признаю, что я тоже довольно плохо знаком с C #.

Вот пример моей самой успешной попытки в минимальной форме, то есть это будет оцениваться как истина, однако это не то же самое пространство выполнения.Если я вызываю $ item в PowerShell, он, очевидно, не знает, о чем идет речь.

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?Или это ужасно неправильно, и что-то уже существует для учета постоянных переменных модуля в C #, которые я пропустил.

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

Предполагая, что ваш Connect-* командлет наследует 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("Get", "Stuff")]
public class GetCmd : PSCmdlet
{
    protected override void EndProcessing()
    {
        WriteObject(SessionState.PSVariable.Get("varName").Value);
    }
}

Обратите внимание, что опция Private не является модификатором видимости или области видимости, а скорее гарантирует, что никто не сможет перезаписать значение переменной.

1 голос
/ 19 июня 2019

Большое спасибо Матиасу выше за его руководство по этому вопросу. Вот минимальный пример для тех, кто ищет это.

Командлет Connect

using System.Management.Automation;

namespace Test
{
    [Cmdlet(VerbsCommunications.Connect, "TestSystem")]
    public class VariableTest : PSCmdlet
    {
        private string _item;
        public string Item
        {
            get { return _item; }
            set { _item = value; }
        }

        protected override void BeginProcessing()
        {
            base.BeginProcessing();
        }

        protected override void ProcessRecord()
        {
            Item = "FooBar";
        }

        protected override void EndProcessing()
        {
            SessionState.PSVariable.Set(new PSVariable(nameof(Item), Item, ScopedItemOptions.Private));
        }
    }
}

Другой командлет

using System.Management.Automation;

namespace Test
{
    [Cmdlet(VerbsCommunications.Read, "TestVariable")]
    public class ReadVariable : PSCmdlet
    {
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
        }

        protected override void ProcessRecord()
        {
            var test = SessionState.PSVariable.Get("Item");
            WriteObject(test.Value.ToString());
        }
    }
}

Результат

PS C:\> Connect-TestSystem
PS C:\> Read-TestVariable
FooBar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...