picasso2 Ответов: 1

Команды PowerShell в C#


Я хотел бы запустить эту команду powershell из C#

ЗЫ&ГТ; тест-код неисправности -LocalComputerName "$env:в ИМЯ_КОМПЬЮТЕРА" -Имя_удаленного_компьютера "myRemotePC" -ResourceManagerPort 17100 -подробный

и поместите вывод в list2

Что я уже пробовал:

Я попробовал несколько рекомендаций от Google.в том числе


PowerShell ps = PowerShell.Создавать();
ПС.AddCommand("Тест-Неисправности");
ПС.AddArgument("-LocalComputerName \"$env:в ИМЯ_КОМПЬЮТЕРА\" -Имя_удаленного_компьютера \"Remotepc\" -ResourceManagerPort 17100 -подробный");

foreach (PSObject result in ps.Взывать())
{


listBox2.Items.Добавить (результат);


} / / End foreach.

но пока не повезло.
Любая помощь будет очень признательна

Richard MacCutchan

но пока не повезло.
Что это должно означать?

1 Ответов

Рейтинг:
1

Graeme_Grant

Да, вы должны видеть исключение времени выполнения:

Цитата:
Система Управления.Автоматизация.RuntimeException произошло
Значение HRESULT=0x80131501
Message=" - LocalComputerName "$env:COMPUTERNAME" - Verbose не является допустимым именем локального компьютера."
А быстро поиск Google[^] найти это: Выполнение сценариев PowerShell из C# – блог разработчика кита Бабинека[^].

Теперь сценарий будет выглядеть примерно так:
using (PowerShell PowerShellInstance = PowerShell.Create())
{
    // use "AddScript" to add the contents of a script file to the end of the execution pipeline.
    // use "AddCommand" to add individual commands/cmdlets to the end of the execution pipeline.
    PowerShellInstance.AddScript("Test-Dtc -LocalComputerName param($param1) -RemoteComputerName param($param2) -Verbose");

    // use "AddParameter" to add a single parameter to the last command/script on the pipeline.
    var localComputer = Environment.GetEnvironmentVariable("COMPUTERNAME");
    PowerShellInstance.AddParameter("param1", localComputer);

    // use "AddParameter" to add a single parameter to the last command/script on the pipeline.
    var remoteComputer = "[Remote Compter Name Goes Here]";
    PowerShellInstance.AddParameter("param2", remoteComputer);

    // invoke execution on the pipeline (collecting output)
    Collection<PSObject> PSOutput = PowerShellInstance.Invoke();

    // loop through each output object item
    foreach (PSObject outputItem in PSOutput)
    {
        // if null object was dumped to the pipeline during the script then a null
        // object may be present here. check for null to prevent potential NRE.
        if (outputItem != null)
        {
            //TODO: do something with the output item 
            // outputItem.BaseOBject
        }
    }
}

Полную документацию можно найти здесь: Microsoft Documents-Powershell & gt; Test-Dtc[^]


picasso2

Большое спасибо, я поместил код внутри кнопки (чтобы вызвать ее)
использование (PowerShell Powersellinstance = PowerShell.Создавать())
{

Powersellinstance.AddScript("тест-код неисправности -LocalComputerName парам($параметр1) -Имя_удаленного_компьютера парам($параметр2) -подробный");


ВАР локальный = среда.GetEnvironmentVariable("MyLocalPC");
Powersellinstance.AddParameter ("param1", localComputer);


Ящик для сообщений.Show ("переменная remotecomputer");
ВАР удаленном компьютере = "MyRemoteSrv";
Powersellinstance.Метод addparameter("параметр2", компьютер);


Коллекция<psobject & gt; PSOutput = Powersellinstance.Взывать();

Ящик для сообщений.Show ("start loop");

по каждому элементу (PSObject outputItem в PSOutput)
{
Ящик для сообщений.Show ("внутри цикла foreach");

if (outputItem != null)
{


Ящик для сообщений.Показать (outputItem.BaseObject.Метод toString());

}

еще
{
Ящик для сообщений.Показать (outputItem.BaseObject.Метод toString());

}

}
}

Ничего не выводится, поэтому я добавил несколько сообщений . Я заметил, что сообщение "start loop" выполняется, но ни один код внутри цикла foreach никогда не выполняется.