Powershell игнорирует параметр, переданный через SessionStateProxy.SetVariable - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующий скрипт Powershell.

param([String]$stepx="Not Working")
echo $stepx

Затем я пытаюсь использовать следующий C # для передачи параметра в этот скрипт.

        using (Runspace space = RunspaceFactory.CreateRunspace())
        {
            space.Open();
            space.SessionStateProxy.SetVariable("stepx", "This is a test");

            Pipeline pipeline = space.CreatePipeline();
            pipeline.Commands.AddScript("test.ps1");

            var output = pipeline.Invoke(); 
        }

После запуска приведенного выше фрагмента кода значение «не работает» находится в выходной переменной. Должно быть "Это тест". Почему этот параметр игнорируется?

Спасибо

1 Ответ

0 голосов
/ 30 июня 2018

Вы определяете $stepx как переменную , которая не совпадает с передачей значения в параметр $stepx вашего скрипта .
Переменная существует независимо от параметра, и поскольку вы не передаете аргумент в свой сценарий, его параметр привязан к значению по умолчанию.

Следовательно, вам нужно передать аргумент (значение параметра) параметру вашего скрипта:

Несколько странно, что скрипт file вызывается через экземпляр Command, которому вы передаете аргументы (значения параметров) через его коллекцию .Parameters.

В отличие от этого, .AddScript() используется для добавления строки в качестве содержимого сценария в памяти (хранящегося в строке), то есть фрагмента исходного кода PowerShell .

Вы можете использовать либо метод для вызова сценария файл с параметрами, хотя если вы хотите использовать строго типизированные аргументы (значения которых не могут быть однозначно выведены из их строковых представлений), используйте подход на основе Command (альтернатива .AddScript() упоминается в комментариях):

  using (Runspace space = RunspaceFactory.CreateRunspace())
  {
    space.Open();

    Pipeline pipeline = space.CreatePipeline();

    // Create a Command instance that runs the script and
    // attach a parameter (value) to it.
    // Note that since "test.ps1" is referenced without a path, it must
    // be located in a dir. listed in $env:PATH
    var cmd = new Command("test.ps1");
    cmd.Parameters.Add("stepx", "This is a test");

    // Add the command to the pipeline.
    pipeline.Commands.Add(cmd);

    // Note: Alternatively, you could have constructed the script-file invocation
    // as a string containing a piece of PowerShell code as follows:
    //   pipeline.Commands.AddScript("test.ps1 -stepx 'This is a test'");

    var output = pipeline.Invoke(); // output[0] == "This is a test"
  }
...