Как запускать сценарии PowerShell с помощью автоматизации, не сталкиваясь с проблемами хоста - PullRequest
7 голосов
/ 17 апреля 2010

Я хочу запустить некоторые сценарии PowerShell с помощью автоматизации. Что-то вроде:

IList errors;
Collection<PSObject> res = null;
using (RunspaceInvoke rsi = new RunspaceInvoke())
{
    try
    {
        res = rsi.Invoke(commandline, null, out errors);
    }
    catch (Exception ex)
    {
        LastErrorMessage = ex.ToString();
        Debug.WriteLine(LastErrorMessage);
        return 1;
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что если мой сценарий использует такие командлеты, как write-host, вышеприведенное выдает System.Management.Automation.CmdletInvocationException -

Невозможно вызвать эту функцию, потому что текущий хост не реализует это.

Какие есть хорошие варианты решения этой проблемы?

1 Ответ

11 голосов
/ 17 апреля 2010

Один из вариантов - создать функцию write-host и внедрить ее в ваше пространство выполнения. Функция будет иметь приоритет над командлетом с тем же именем. В этой функции вы можете ничего не делать или, возможно, использовать [console] :: writeline (), если ваше приложение является консольным приложением или если ваше приложение является приложением с графическим интерфейсом, вставьте некоторый объект в сеанс PowerShell, чтобы функция могла записать вывод (посмотрите на Runspace.SessionStateProxy.SetVariable).

Другой (немного более сложный) вариант - реализовать в вашем приложении интерфейсы хостинга PowerShell .

...