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部分时,它甚至不会抛出一个错误。

c#和PowerShell:如何添加以逗号分隔的参数

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