C# PowerShell - AddScript как несколько операторов - PullRequest
1 голос
/ 31 марта 2020

Я изо всех сил пытаюсь найти способ выполнить многострочный и многострочный сценарий PowerShell в C# таким образом, чтобы все результаты были доступны из метода Invoke (). Похоже, что команды, добавленные PowerShell.AddScript, всегда передаются вместе . Но я хотел бы, чтобы они читались, анализировались и выполнялись как множественные операторы, а все результаты отдельных операторов записывались в вывод .

Возможно ли это?

Что я делаю сейчас:

            using PowerShell powerShell = PowerShell.Create();
            powerShell.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted").AddParameter("Scope", "CurrentUser").AddStatement();
            powerShell.AddScript(@"multiple powershell statements 
            on multiple rows, some of them writing to output"); //No intermediate results will be logged or printed as the script is added as a single pipeline
            powerShell.AddScript("$?"); //This is to echo the execution status of the last command into results
            var results = powerShell.Invoke();

Сбор результатов содержит только один результат, и это эхо последних $? заявление, которое я тогда запрашиваю, чтобы узнать информацию о пройденном / неудачном выполнении. Я также запрашиваю поток ошибок, но это не относится к вопросу.

Проблема заключается в следующем: Я получаю сценарий PowerShell в качестве пользовательского ввода и поэтому не могу его изменить и добавить в качестве операторов. Я думал о добавлении сценария построчно, но он сломает возможные многострочные конвейеры, кодовые блоки и т. Д. c. Поэтому, чтобы достичь желаемого результата, мне нужно было бы проанализировать сам сценарий, который звучит довольно сложно. Существует ли какое-либо элегантное решение для получения всех результатов из Invoke () и, что наиболее важно, добавления сложного сценария из пользовательского ввода без его дробления в один конвейер, передачи результатов одной команды в другую?

1 Ответ

0 голосов
/ 31 марта 2020

Просто использовать конкатенацию строк для добавления оператора $? к полученным операторам, которому предшествует ; (разделитель операторов):

powerShell.AddScript(@"multiple powershell statements 
            on multiple rows, some of them writing to output" + ";$?");

Таким образом, все операторы представлены как один скрипт [блок] (фрагмент кода PowerShell).

Последовательные .AddScript() вызовы не суммируются - последний «выигрывает».

В качестве альтернативы, добавьте .AddStatement() к каждому .AddScript() вызову , аналогично тому, как вы уже делаете для вызова .AddCommand(), который меняет политику выполнения.

Однако это более эффективно передавать только один фрагмент кода PowerShell, используя один .AddScript() вызов , как показано выше.


Наконец, обязательный предупреждение системы безопасности :

Я получаю сценарий PowerShell в качестве пользовательского ввода

Если вы сначала не проверите и не выполните санитарную обработку ввода, выполняйте его только при условии доверия источник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...