передача параметров в powershell из c # - PullRequest
2 голосов
/ 07 апреля 2010

Я пытаюсь передать параметр в 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 Ответ

3 голосов
/ 07 апреля 2010

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

& { param($ds); $ds }

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

update

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

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

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

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

... прямо в командной строке;это бессмысленно.Имеет смысл?

-Oisin

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