Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#将参数传递给PowerShell脚本?_C#_Powershell - Fatal编程技术网

如何使用C#将参数传递给PowerShell脚本?

如何使用C#将参数传递给PowerShell脚本?,c#,powershell,C#,Powershell,我正在尝试使用C 我的脚本需要参数才能运行,否则将抛出错误 这是我脚本的精简版本 param ($url) if ($url -eq $null) { throw "No Url was provided" } write-host "$url was the provided value" 现在,使用C我尝试执行以下脚本 try { var defaultSessionState = InitialSessionState.CreateDefault(); def

我正在尝试使用
C

我的脚本需要参数才能运行,否则将抛出错误

这是我脚本的精简版本

param ($url)
if ($url -eq $null) {
    throw "No Url was provided" 
}

write-host "$url was the provided value"
现在,使用
C
我尝试执行以下脚本

try {
    var defaultSessionState = InitialSessionState.CreateDefault();
    defaultSessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Unrestricted;

    using PowerShell ps = PowerShell.Create(defaultSessionState);

    ps.AddScript(@"d:\test.ps1");
    ps.AddParameter("url", "http://example.com/test/");
    ps.Runspace.SessionStateProxy.SetVariable("ErrorActionPreference", "stop");
} 
catch (Exception e) {

}
但我一直发现
没有提供Url
错误。如何将参数正确地传递给脚本,以及如何访问它?

AddScript()
用于执行原始代码-
D:\test.ps1
恰好是有效代码,但它更适合作为字符串插入完整的自包含脚本

您需要将脚本文件引用添加为命令,此时我们可以应用参数-为此,请使用
AddCommand()

使用(PowerShell ps=PowerShell.Create(defaultSessionState))
{
ps.AddCommand(“d:\test.ps1”);
ps.AddParameter(“url”http://example.com/test/");
ps.AddParameter(“错误动作”、“停止”);
//或
SetVariable(“ErrorActionPreference”、“stop”);
}
AddScript()
用于执行原始代码-
D:\test.ps1
恰好是有效代码,但它更适合作为字符串插入完整的自包含脚本

您需要将脚本文件引用添加为命令,此时我们可以应用参数-为此,请使用
AddCommand()

使用(PowerShell ps=PowerShell.Create(defaultSessionState))
{
ps.AddCommand(“d:\test.ps1”);
ps.AddParameter(“url”http://example.com/test/");
ps.AddParameter(“错误动作”、“停止”);
//或
SetVariable(“ErrorActionPreference”、“stop”);
}
提供了一个有效的解决方案,但让我进一步解释一下:

PowerShell SDK的方法的名称有点不恰当,因为它不执行脚本文件,而是执行任意一段PowerShell代码。也就是说,它期望的是一个包含整个PowerShell语句的字符串,换句话说:脚本文件的内容,而不是脚本文件的路径。

考虑到在PowerShell中,一段可重用代码被表示为脚本块,类似于
.AddScriptBlock()
的名称将不会太容易混淆(但请注意,在调用
.AddScript()
时,不能将包含要在
{…}
中执行的语句的字符串括起来)。[1]

Mathias的回答说明了是如何使用的正确方法,因为PowerShell中的命令表示可以直接执行的内容:别名、函数、cmdlet、外部可执行文件以及脚本文件


至于你所尝试的

字符串
d:\test.ps1
被解释为一段PowerShell代码(与在命令行上提交此字符串的方式相同)。该代码碰巧调用了脚本文件,但没有参数。
也就是说,调用了脚本,但没有通过
.AddParameter()
添加的参数

  • 还请注意,如果脚本路径碰巧包含空格或嵌入变量引用,则必须使用嵌入的引号,并通过
    &
    调用结果;e、 g.,
    .AddScript(@“d:\test 1.ps1”)-有关详细信息,请参阅密切相关的问题
但是,请注意,
.AddParameter()
调用在技术上仍然有效,但接收参数的是整个脚本块,而不是其中的(一)语句—对
d:\test.ps1
的调用

从技术上讲,可以通过(在没有通过
param(…)
块进行显式参数声明的情况下,收集所有参数)将参数中继到脚本文件调用:

也就是说,如果您的代码只调用一个脚本文件(带参数),那么
.AddCommand()
解决方案既简单又高效;此外,它还避免了执行机器的PowerShell可能出现的问题,因为只有
.AddScript()
-添加的语句才会受到影响


[1]
.AddScript(“…”)
,以PowerShell代码表示,有效地执行以下操作:
。{…}

也就是说,它将字符串解析为脚本块,并通过
执行它(稍后调用
.Invoke()
时)。

提供了一个有效的解决方案,但让我进一步说明:

PowerShell SDK的方法的名称有点不恰当,因为它不执行脚本文件,而是执行任意一段PowerShell代码。也就是说,它期望的是一个包含整个PowerShell语句的字符串,换句话说:脚本文件的内容,而不是脚本文件的路径。

考虑到在PowerShell中,一段可重用代码被表示为脚本块,类似于
.AddScriptBlock()
的名称将不会太容易混淆(但请注意,在调用
.AddScript()
时,不能将包含要在
{…}
中执行的语句的字符串括起来)。[1]

Mathias的回答说明了是如何使用的正确方法,因为PowerShell中的命令表示可以直接执行的内容:别名、函数、cmdlet、外部可执行文件以及脚本文件


至于你所尝试的

字符串
d:\test.ps1
被解释为一段PowerShell代码(与在命令行上提交此字符串的方式相同)。该代码碰巧调用了脚本文件,但没有参数。
也就是说,调用了脚本,但没有通过
.AddParameter()
添加的参数

  • 还要注意,如果脚本路径为h
    ps.AddScript(@"d:\test.ps1 @args");