Передача параметров в powershell из C#

Я пытаюсь передать параметр в PowerShell из веб-приложения C#, но получаю сообщение об ошибке:

Reason = {"Термин" Param($ds)\r\n\r\n$ds\r\n\r\n\r\n'не распознается как имя командлета, функции, файла сценария, или работоспособная программа. Проверьте правильность написания имени, или, если путь был указан, проверьте правильность пути и повторите попытку."}

Мой скрипт Powershell выглядит следующим образом:

Param($ds)
write-host $ds

Мой C# это:

protected void drpCluster_SelectedIndexChanged(object sender, EventArgs e)
{
    // Looping through all the rows in the GridView
    foreach (GridViewRow row in GridVMApprove.Rows)
    {
        if (row.RowState == DataControlRowState.Edit)
        {
            // create dynamic dropDowns for datastores
            DropDownList drpDatastore = (DropDownList)row.FindControl("drpDatastore");
            DropDownList drpCluster = (DropDownList)row.FindControl("drpCluster");
            var Datacenter = "'" + drpCluster.SelectedValue + "'";
            strContent = this.ReadPowerShellScript("~/scripts/Get-DatastoresOnChange.ps1");
            this.executePowershellCommand(strContent, Datacenter);
            populateDropDownList(drpDatastore);
        }
    }
}
public string ReadPowerShellScript(string Script)
{
    // Read script
    StreamReader objReader = new StreamReader(Server.MapPath(Script));
    string strContent = objReader.ReadToEnd();
    objReader.Close();
    return strContent;
}
private string executePowershellCommand(string scriptText, string scriptParameters)
{
    RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
    PSSnapInException snapInException = null;
    PSSnapInInfo info = rsConfig.AddPSSnapIn("vmware.vimautomation.core", out snapInException);
    Runspace RunSpace = RunspaceFactory.CreateRunspace(rsConfig);
    RunSpace.Open();
    Pipeline pipeLine = RunSpace.CreatePipeline();
    Command scriptCommand = new Command(scriptText); 
    pipeLine.Commands.AddScript(scriptText);
    if (!(scriptParameters == null))
    {
        CommandParameter Param = new CommandParameter(scriptParameters);
        scriptCommand.Parameters.Add(Param);
        pipeLine.Commands.Add(scriptCommand);              
    }
    // Execute the script
    Collection<PSObject> commandResults = pipeLine.Invoke();
    // Close the runspace
    RunSpace.Close();
    // Convert the script result into a single string
    System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
    foreach (PSObject obj in commandResults)
    {
        stringBuilder.AppendLine(obj.ToString());
    }
    OutPut = stringBuilder.ToString();
    return OutPut;
}

Я подписался на некоторые другие темы, но не могу выполнить скрипт. Мои сценарии PowerShell выполняются, если я запускаю их из консоли PowerShell, просто вызывая сценарий и параметр. Если я удалю Param($ds) из скрипта PowerShell это не ошибка.

Кто-нибудь может помочь?

Благодарю.

1 ответ

Только блок скриптов, файлы ps1/psm1 и функции / фильтры могут иметь блок param. Сценарий, который вы должны добавить с помощью AddScript, должен иметь вид:

& { param($ds); $ds }

& является оператором вызова. В вашем примере вы пытаетесь выполнить param как команду.

Обновить

Вы должны передать аргументы в блок скриптов следующим образом:

& {param ($ ds); $ ds} 42

Это приводит к тому, что 42 передаются в блок скриптов. Прикрепление скрипта с помощью AddScript не создает файл ps1. Это похоже на то, как вы печатаете:

ps c:\> param($ds); $ds

... прямо по подсказке; это бессмысленно. Есть смысл?

-Oisin

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