c#和PowerShell:如何添加以逗号分隔的参数
本文关键字:分隔 参数 添加 PowerShell 何添加 | 更新日期: 2023-09-27 18:17:39
我试图运行一个命令,它不工作,这是在PowerShell命令提示符下工作得很好的命令:
mcli-add DiskLocator -r diskLocatorName=XAShared-2015-10-13, siteName=mysite, storeName=pvs_prod
这是我试图使用的代码,使该命令的工作。我已经尝试了许多方法(参见注释行),从将其全部放在一行中到将其放在单独的参数中,再到不放逗号和放逗号。参数名称为-p,后面的部分为实参。
这是我现在拥有的代码,试图捕获似乎成功的输出,但它实际上没有做任何事情,我在事件日志中获得Executing: Add DiskLocator
,但我没有看到第二个结果,应该是Add Succeeded.
,后跟一个结果ID:
using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
PSSnapInException psex;
runspace.RunspaceConfiguration.AddPSSnapIn("McliPSSnapIn", out psex);
Pipeline pipeline = runspace.CreatePipeline();
Command mcliAdd = new Command("mcli-add");
mcliAdd.Parameters.Add(null, "DiskLocator");
mcliAdd.Parameters.Add("-r", "diskLocatorName=" + diskLocatorName + ", " + "siteName=" + siteName + ", " + "storeName=" + storeName);
//mcliAdd.Parameters.Add("siteName=" + siteName + ", ");
//mcliAdd.Parameters.Add("storeName=" + storeName);
pipeline.Commands.Add(mcliAdd);
Collection<PSObject> output = pipeline.Invoke();
foreach (PSObject x in output)
{
log.WriteEntry(x.ToString(), EventLogEntryType.Information);
}
}
我在未注释的注释行中得到的错误如下:
无法找到与参数名称'siteName=mysite'匹配的参数
更新:
更奇怪的是,我可以随意把这行放在逗号后面,它不会抛出错误:
mcliAdd.Parameters.Add("r", "who cares what I put here nothing happens");
这使我相信DiskLocator参数没有被正确使用。我不能用它作为参数因为它说那不是参数名。
然而,这不能是真的,因为如果我删除它或-r,它要么说DiskLocator缺失或-r缺失。如果我只传递-r而不传递其他细节,它会抛出一个错误,抱怨没有string[]数组值。所以我很困惑。如果我不提供整个数组,它应该抛出一个错误,但是当我只传递disklocatorname部分时,它甚至不会抛出一个错误。
-r
的参数似乎是一个数组。你需要给它一个字符串数组。另外,在传递参数时,必须省略-
,因为它只是命令行上的参数分隔符。参数本身称为"r"。
mcliAdd.Parameters.Add("r", new string[]{"diskLocatorName=" + diskLocatorName, "siteName=" + siteName, "storeName=" + storeName});
或者类似的东西。
如果做不到这一点,可以尝试另一种方法(假设powershell模块写得很糟糕):
mcliAdd.Parameters.Add(null, "-r diskLocatorName=" + diskLocatorName + ", " + "siteName=" + siteName + ", " + "storeName=" + storeName);
另一种可能性:
Command mcliAdd = new Command("mcli-add");
pipeline.Commands.Add(mcliAdd);
ps.AddArgument("DiskLocator");
ps.AddParameter("r", new string[]{"diskLocatorName=" + diskLocatorName, "siteName=" + siteName, "storeName=" + storeName});
// Alternatively add both using AddArgument
Powershell并不总是像您期望的那样将逗号视为分隔符。尝试使用空格或括号(或三个都使用:"(Value), (value2), (value3)")
@Eris已经建议了一个数组;
$item = @()
$item += "-r"
$item += ("diskLocatorName=" + diskLocatorName + ", " + "siteName=" + siteName + ", " + "storeName=" + storeName)
function($item)
您也可以尝试使用中间变量:
$item = ("diskLocatorName=" + diskLocatorName + ", " + "siteName=" + siteName + ", " + "storeName=" + storeName)
function(("-r"), ($item))
应该注意的是,数组的字符串连接需要一个括号。$test = "a"+"b"
失败,但$test = ("a"+"b")
成功。省略括号会产生多个数组元素。