如何使用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");