Загрузка модуля Powershell останавливается в коде C # при использовании Write-Progress - PullRequest
1 голос
/ 09 августа 2010

У меня есть этот сервис, который при получении запроса запускает команду powershell и возвращает результат. Вот код класса invoker:

public class PowerShellScript {

    public PowerShellScript() {
    }

    public Object[] Invoke( String strScriptName, NameValueCollection nvcParams ) {
        Boolean bResult = true;
        int n = 0;
        Object[] objResult = null;
        PowerShell ps = PowerShell.Create();
        String strScript = strScriptName;

        for (n = 0; n < nvcParams.Count; n++) {
            strScript += String.Format( " -{0} {1}", nvcParams.GetKey( n ), nvcParams[n] );
        }

        //ps.AddScript( @"E:\snapins\Init-profile.ps1" );
        ps.AddScript( strScript );
        Collection<PSObject> colpsOutput = ps.Invoke();
        if (colpsOutput.Count > 0)
            objResult = new Object[colpsOutput.Count];

        n = 0;
        foreach (PSObject psOutput in colpsOutput) {
            if (psOutput != null) {
                try {
                    objResult[n] = psOutput.BaseObject;
                }
                catch (Exception ex) { 
                    //exception should be handeled properly in powershell script
                }
            }
            n++;
        }
        colpsOutput.Clear();
        ps.Dispose();

        return objResult;
    }
}

Метод Invoke возвращает все результаты, возвращаемые скриптом powershell. Проблема, однако, заключается в том, что если вызываемый сценарий содержит Write-Progress либо в импортированном модуле, либо в самом сценарии, класс Powershell почему-то полагает, что это реальный вывод, и мгновенно завершает выполнение сценария, возвращая в качестве объекта значение null.

В идеале можно блокировать вывод с помощью командлета Out-Null, но он не работает для Write-Progress. Есть идеи как заблокировать Write-Progress?

1 Ответ

1 голос
/ 09 августа 2010

Я попробовал ваш код, и он работал в обычном консольном приложении и даже в приложении Windows с простым скриптом с некоторыми выходными данными и вызовами Write-Progress. Таким образом, проблема не так легко воспроизводима ...

класс Powershell почему-то считает, что это реальный вывод и завершает выполнение скрипта мгновенно

Хм, возможно, он просто терпит неудачу, а не «обрабатывает вывод по-другому», и поэтому вывод пустой. Можете ли вы проверить сбор ошибок после выполнения?

Любые идеи о том, как заблокировать Написать-Прогресс?

Если вы просто собираетесь его заблокировать, то это должно сработать: перед вызовом рабочего скрипта вызовите скрипт «profile» с этой командой, устанавливающей фиктивную замену:

function global:Write-Progress {}

Таким образом, когда ваш скрипт вызывает Write-Progress, тогда фактически вызывается фиктивная функция Write-Progress, которая фактически эффективно блокирует Write-Progress.

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