C#和PowerShell:如何添加逗号分隔参数?

时间:2015-10-14 18:55:17

标签: c# powershell

我试图运行命令并且它无法正常工作,这是在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);
                }
            }

我对未注释的注释行的错误是这样的:

找不到与参数名称匹配的参数&#39; siteName = mysite&#39;

更新

即使是更奇怪的是,我可以在逗号之后以任何方式将此行放在这里,它不会抛出错误:

mcliAdd.Parameters.Add("r", "who cares what I put here nothing happens");

这让我相信DiskLocator参数没有被正确使用。我无法将其用作参数,因为它表示不是参数名称。

然而,这不可能是真的,因为如果我删除它或-r它或者说DiskLocator丢失或者-r缺失。如果我只传递-r而没有其他细节,则会抛出一个错误,抱怨没有string []数组值。所以我在这里不知所措。如果我不提供整个数组,它应该抛出一个错误,但是当我只传递disklocatorname部分时它甚至没有抛出错误。

2 个答案:

答案 0 :(得分:1)

-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

答案 1 :(得分:0)

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")成功。省略括号会产生多个数组元素。