Чтение json данных из скрипта Powershell в консольном приложении c# - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь прочитать скрипт PowerShell для создания службы бота в Azure. Я могу добиться этого в windows PowerShell, но тот же сценарий, когда я пытаюсь прочитать из консольного приложения, он ничего не возвращает. Моя цель - запустить этот скрипт в качестве веб-задания. Ниже мой c# код

  using (Runspace myRunSpace = RunspaceFactory.CreateRunspace())
            {
                myRunSpace.Open();
                using (PowerShell powershell = PowerShell.Create())
                {
                    // Create a pipeline with the Get-Command command.
                    powershell.AddScript("Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted");
                    powershell.AddScript(@"C:\Users\Admin\Desktop\MyFile.ps1");
                    // add an extra command to transform the script output objects into nicely formatted strings
                    // remove this line to get the actual objects
                    powershell.AddCommand("Out-String");
                    // execute the script
                    var results = powershell.Invoke();
                    powershell.Streams.ClearStreams();
                    powershell.Commands.Clear();
                    // convert the script result into a single string
                    StringBuilder stringBuilder = new StringBuilder();
                    foreach (PSObject obj in results)
                    {
                        stringBuilder.AppendLine(obj.ToString());
                    }
                    Console.WriteLine(stringBuilder.ToString());
                    Console.ReadLine();
                }
            }

Вот мой скрипт:

Connect-AzureRmAccount;
$Name="Hello";
$Password="xxxx";
$desc=az ad app create --display-name $Name --password $Password --available-to-other-tenants;
return $desc;

Этот скрипт возвращает Json в переменной "$ des c" в windows powershell , но не в консольном приложении. Может ли кто-нибудь помочь мне здесь, если мне что-то не хватает.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Исходя из вышеизложенного, я хотел бы дать более полный ответ, знайте, что мы знаем сценарий лучше.

Для того, что вы пытаетесь сделать, вы в основном хотите go из C# (в данном случае веб-задание в Azure) для подключения серверных служб Azure для предоставления чего-либо. Я бы предположил, что прямо сейчас на вашем пути слишком много технологий. Это в основном (прямо сейчас): Azure Webjob -> PowerShell -> Azure Cli ("az) -> Azure SDK -> Azure API (или Graph API)

Вместо этого я Я бы посоветовал вам сделать одно из следующего:

1) учитывая, что вы находитесь в C#, вы можете напрямую вызвать Microsoft Graph API, пропуская 3 технологии в миксе. Например, чтобы создать приложение Azure AD, вы должны вызывать конечную точку Create application . К счастью, вам даже не нужно напрямую вызывать конечную точку, вы можете использовать. net ( т. е. C#) SDK, который Microsoft предоставляет для именно такого рода операций.

2) Кроме этого, хотя и просто не интересно, почему вы используете веб-работу? I Я хотел бы предложить вам изучить Azure Функции вместо этого - они ОЧЕНЬ легкие (и, возможно, НАМНОГО дешевле, в зависимости от того, что вы пытаетесь сделать)

3) Помимо вышеизложенного, существуют совершенно разные способы развертывания и управления Azure артефактами (приложения, бо тс, что угодно). Вам следует взглянуть на Azure Resource Manager в качестве одного варианта или также на что-то вроде Terraform в типе решения "Инфраструктура как код".

Так что некоторые домашние задания возможно для вас, но надеюсь, что это поможет

0 голосов
/ 23 января 2020

Кажется, что вы очищаете потоки после выполнения команды, поэтому она очищает результаты.

// execute the script
var results = powershell.Invoke();
// Clears all the Streams 
powershell.Streams.ClearStreams();

Попробуйте очистить потоки перед вызовом

// Clears all the Streams 
powershell.Streams.ClearStreams();
// execute the script
var results = powershell.Invoke();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...