Запустите скрипт Powershell с параметрами, удаленно переданными из C#

Я пытался запустить скрипт PowerShell из C# в двух случаях. Один случай — запустить его локально (powershell.ps1 на локальном компьютере), а другой — запустить на удаленном компьютере (powershell.ps1 на удаленном компьютере).

Скрипт содержит функцию, которая имеет обязательные параметры servicename и action, в которые должен быть вставлен пользователем. Я хотел передать параметры из консольного приложения С#.

powershell.ps1

param (
[Parameter(Mandatory=$true)]
[string] $ServiceName,
[String] $Action
)

function CheckService($ServiceName)
{
    if (Get-Service $ServiceName -ErrorAction SilentlyContinue)
    {
        $ServiceStatus = (Get-Service -Name $ServiceName).Status
        return "$ServiceName - $ServiceStatus"
    }
    else
    {
        return"$ServiceName not found"
    }
}

if (Get-Service $ServiceName -ErrorAction SilentlyContinue)
{

    if ($Action -eq 'Check')
    {
        CheckService $ServiceName
    }
    else
    {
        return "Action parameter is missing or invalid!"
    }
}
else
{
    return "$ServiceName not found"
}

Я вызвал функцию запуска сценария из основной функции следующим образом:

Программа.cs

 static void Main(string[] args)
 {
    try
    {
        var scriptremote = @"C:\\remote\\powershell.ps1 service1 check";
        var scriptlocal = @"\\local\\powershell.ps1 service1 check";
        var computer = "xxxxx.yyyy.com";
        var username = @"user";
        var password = "p4$$w0rD";
        string errors;
        IEnumerable<PSObject> output;
        var success = RunPowerShellScriptRemote(scriptremote, computer, username, password, out output, out errors);
        var localrun = RunPowerShellScript(scriptlocal, out output, out errors);
    }
    catch (Exception e)
    {
        Console.Write(e.Message);
    }
    Console.ReadKey();
 }

public static bool RunPowerShellScript(string script, out IEnumerable<PSObject> output, out string errors)
{
    return RunPowerShellScriptInternal(script, out output, out errors, null);
}

public static bool RunPowerShellScriptRemote(string script, string computer, string username, string password, out IEnumerable<PSObject> output, out string errors)
{
    output = Enumerable.Empty<PSObject>();
    var credentials = new PSCredential(username, ConvertToSecureString(password));
    var connectionInfo = new WSManConnectionInfo(false, computer, 5985, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.PowerShell", credentials);
    var runspace = RunspaceFactory.CreateRunspace(connectionInfo);
    try
    {
        runspace.Open();
    }
    catch (Exception e)
    {
        errors = e.Message;
        return false;
    }
    return RunPowerShellScriptInternal(script, out output, out errors, runspace);
}

public static bool RunPowerShellScriptInternal(string script, out IEnumerable<PSObject> output, out string errors, Runspace runspace)
{
    output = Enumerable.Empty<PSObject>();
    using (var ps = PowerShell.Create())
    {
        ps.Runspace = runspace;
        ps.AddScript(script);
        ps.AddParameter("service1");
        ps.AddParameter("Check");
        try
        {
            output = ps.Invoke();
            foreach (var o in output)
                Console.Write(o.ToString());
        }
        catch (Exception e)
        {
            Trace.TraceError("Error occurred in PowerShell script: " + e);
            errors = e.Message;
            return false;
        }

        if (ps.Streams.Error.Count > 0)
        {
            errors = String.Join(Environment.NewLine, ps.Streams.Error.Select(e => e.ToString()));
            return false;
        }

        errors = String.Empty;
        return true;
    }
}

Этот код может запустить его локально и показать желаемый результат. Но когда я попытался запустить его удаленно, возникла ошибка (даже это то же самое, что и локально):

The term 'C:\\remote\\powershell.ps1 service1 check' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again

Я также пытался использовать ps.AddCommands вместо ps.AddScript, но не получил результата. Также пытался объявить scriptremote = @"&\"C:\\remote\\powershell.ps1" service1 check", но получил ту же ошибку.

Для справки: удаленный доступ в порядке. Различные файлы .ps1 на удаленном компьютере без параметров могут быть запущены и успешно отображать вывод.

Как я могу отправить параметры servicename и action из приложения С# в сценарий .ps1 и показать желаемый результат обратно в приложении С#?

Вы пробовали удалить ненужные косые черты? var scriptremote = @"C:\remote\powershell.ps1 service1 check"; сделаю

Mathias R. Jessen 05.03.2019 11:39

@MathiasR.Jessen, да, я тоже пробовал. нет выходного улова для удаленного запуска. но он хорошо работает с локальным запуском.

HNA 06.03.2019 01:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
453
0

Другие вопросы по теме