Powershell 忽略通过 SessionStateProxy.SetVariable 传递的参数
Powershell ignores parameter passed via SessionStateProxy.SetVariable
我有以下 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();
}
上面的代码片段是运行之后,输出变量中的值是"not working"。应该是"This is a test"。为什么忽略该参数?
谢谢
您将 $stepx
定义为 变量,这与将值传递给脚本的 $stepx
不同参数.
该变量独立于参数存在,并且由于您没有将 参数 传递给脚本,因此它的参数绑定到其默认值。
因此,您需要将参数(参数值)传递给脚本的参数:
有点令人困惑,脚本 file 是通过 Command
实例 调用的,您向其传递参数(参数值) 通过其 .Parameters
集合。
相比之下,.AddScript()
用于添加一个字符串作为in的contents -memory 脚本(存储在字符串中),即 a PowerShell 源代码片段.
您可以使用 任一 技术来调用带参数的脚本 file,但如果您想使用 strongly typed 参数(不能从它们的字符串表示中明确地推断出其值),使用基于 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"
}
我有以下 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();
}
上面的代码片段是运行之后,输出变量中的值是"not working"。应该是"This is a test"。为什么忽略该参数?
谢谢
您将 $stepx
定义为 变量,这与将值传递给脚本的 $stepx
不同参数.
该变量独立于参数存在,并且由于您没有将 参数 传递给脚本,因此它的参数绑定到其默认值。
因此,您需要将参数(参数值)传递给脚本的参数:
有点令人困惑,脚本 file 是通过 Command
实例 调用的,您向其传递参数(参数值) 通过其 .Parameters
集合。
相比之下,.AddScript()
用于添加一个字符串作为in的contents -memory 脚本(存储在字符串中),即 a PowerShell 源代码片段.
您可以使用 任一 技术来调用带参数的脚本 file,但如果您想使用 strongly typed 参数(不能从它们的字符串表示中明确地推断出其值),使用基于 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"
}