我试图运行命令并且它无法正常工作,这是在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部分时它甚至没有抛出错误。
答案 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")
成功。省略括号会产生多个数组元素。