C # Powershell Runspace доступно для всех методов

1

Быстрый вопрос относительно Powershell вызывает в С#

Я хотел бы попросить С# загрузить модуль powershell в отдельный метод, а затем запустить команды Powershell другим способом.

В настоящее время из моих (ограниченных) знаний о вызове PS в С#, похоже, что я не могу получить доступ к экземпляру powershell из другого метода - это правильно?

Пример кода ниже. Я смотрю на пробелы в usind, но не хочу слишком много времени сжигать, исследуя это.

Любая помощь в наилучшем способе доступа к экземпляру powershell (с загруженным модулем) из других методов в классе будет действительно оценена.

namespace Test
{
    public class Test
    {

    public void loadModule()
    {
       using (PowerShell PowershellInstance = PowerShell.Create())
        {
            PowershellInstance.AddScript("Add-PSSnapin VMware.VimAutomation.Core");
            PowershellInstance.Invoke();
            if (PowershellInstance.Streams.Error.Count > 0)
            {
                infoBox.Text = "Error loading snapin";
                return;
            }
            else
            {
                infoBox.Text = "Loaded";
            }

            PowershellInstance.Commands.Clear();
        }
     }

     public void someOtherMethod()
     {
           //do some more powershell - without loading module
     }
  • 0
    Не могли бы вы создать приватный метод? Или даже просто инициализировать его как переменную класса? Просто убедитесь, что вы правильно его почистили.
  • 0
    Да, в конце концов, мы использовали переменную класса, не самый элегантный из способов, но это работает !!
Теги:
powershell

1 ответ

1

В зависимости от того, как вы реализовали это с переменной класса, вы, вероятно, также захотите реализовать IDisposable для очистки ссылки PowerShell. В противном случае вы не будете правильно освобождать все ресурсы памяти\ресурсы.

Что-то вроде этого:

    public class Test : IDisposable
    {
        private bool disposed;
        private PowerShell ps;

        public Test()
        {
            disposed = false;
            ps = PowerShell.Create();
        }

        public void loadModule()
        {
            ps.AddCommand("Add-PSSnapin")
              .AddParameter("Name", "VMware.VimAutomation.Core")
              .Invoke();

            if (ps.HadErrors)
                infoBox.Text = "Error loading snapin";
            else
                infoBox.Text = "Loaded";

            ps.Commands.Clear();
        }

        public void someOtherMethod()
        {
            //do some more powershell - without loading module

            ps.Commands.Clear();
        }

        public void Dispose()
        {
            Dispose(true);
        }

        private void Dispose(bool disposing)
        {
            if (!disposed)
            {
                disposed = true;
                if (disposing)
                {
                    if (ps != null)
                    {
                        ps.Dispose();
                        ps = null;
                    }
                }
            }
        }
    }

Обратите внимание, что вы можете использовать ps.HadErrors вместо проверки потока ошибок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню