Запускать скрипты powershell из С#

avatar
Bad-Ass
8 апреля 2018 в 12:03
11495
1
6

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

Это скрипт: DISM /online /Enable-Feature /Featurename:NetFx3 /All

Сценарий включает Framwork 3.5 на сервере Windows. Источник

Мой код:

NuGet: System.Management.Automation

using (PowerShell PowerShellInstance = PowerShell.Create()) 
{ 
    PowerShellInstance.AddScript("DISM /online /Enable-Feature /Featurename:NetFx3 /All ");

    // begin invoke execution on the pipeline
    IAsyncResult result = PowerShellInstance.BeginInvoke();

    // do something else until execution has completed.
    // this could be sleep/wait, or perhaps some other work
    while (result.IsCompleted == false)
    {
        Console.WriteLine("Waiting for pipeline to finish...");
        Thread.Sleep(1000);

        // might want to place a timeout here...
    }

    Console.WriteLine("Finished!");
}

Я использовал примеры из здесь

Примечание: мое приложение запускается от имени администратора.

Источник
Daniel
8 апреля 2018 в 12:16
0

в чем ошибка? попробуйте обернуть его блоком try-catch.

Bad-Ass
8 апреля 2018 в 12:21
0

Нет ошибки, она не включает функцию 3.5. Через несколько секунд консоль говорит "готово"

Patrick Meinecke
8 апреля 2018 в 14:28
2

Проверьте PowerShellInstance.HadErrors. Если это так, проверьте PowerShellInstance.InvocationStateInfo.Reason для исключения, если это нуль, проверьте PowerShellInstance.Streams.Error для незавершающих записей об ошибках. Если ни один из них не дает нужной информации, PowerShellInstance.EndInvoke(result) выдаст вывод команды.

Ответы (1)

avatar
Aspram
9 апреля 2018 в 08:06
3

Попробуйте добавить права администратора в ваш скрипт powershell, иногда это помогает

PowerShell.exe -NoProfile -ExecutionPolicy Unrestricted -Command "& {Start-Process PowerShell -windowstyle hidden -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted -noexit -File "$ScriptPath"' -Verb RunAs}"

Вы можете сохранить команду powershell в файле ps1 и указать путь в качестве параметра ($ScriptPath). Эта команда powershell протестирована на C# путем запуска указанного вами кода. Надеюсь это поможет. Если нет, то я советую использовать Process из пространства имен C# System.Diagnostics.