在c#中使用文字和代码块与powershell 2.0交互的问题
本文关键字:powershell 交互 问题 代码 文字 | 更新日期: 2023-09-27 18:09:52
如果我尝试通过c#运行Powershell
命令,我会得到以下错误:术语"select"不能被识别为cmdlet
、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后再试一次。"
如果命令是直接执行与Powershell(.exe)
所有工作正常!
我尝试运行的命令看起来像i.g:"Get-Mailbox -Organization 'CoolOrganizationNameGoesHere'
| select ServerName
"
似乎"管道"有问题,我浪费了很多时间在各大搜索引擎上搜索最疯狂的关键词组合,但我没有发现任何有用的
我尝试的最后一件事是为Powershell
设置已发布的IIS-Application
的PSLanguageMode
属性,结果仍然与之前写的相同。
可能WinRM
配置错误?或者我的本地Powershell
配置已损坏?是否有关于c#(或任何其他。net语言)使用Powershell
远程访问的良好编写文档并使用Pipe |"命令"?
谁能告诉我怎么了,这就像大海捞针一样!
谢谢!
技巧可能在于您创建命令的方式。如果脚本作为字符串运行,应该使用:
Command myCommand = new Command(script, true);
但是如果你想把它作为文件名运行,你应该使用:
Command myCommand = new Command(script, false);
:
Command myCommand = new Command("Get-Date", true);
Command myCommand = new Command("c:'test.ps1", false);
如果你需要完整的方法:
private static IEnumerable<PSObject> ExecutePowerShellScript(string script, bool isScript = false, IEnumerable<KeyValuePair<string, object>> parameters = null)
{
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
Command myCommand = new Command(script, isScript);
if (parameters != null)
{
foreach (var parameter in parameters)
{
myCommand.Parameters.Add(new CommandParameter(parameter.Key, parameter.Value));
}
}
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.Add(myCommand);
var result = pipeline.Invoke();
// Check for errors
if (pipeline.Error.Count > 0)
{
StringBuilder builder = new StringBuilder();
//iterate over Error PipeLine until end
while (!pipeline.Error.EndOfPipeline)
{
//read one PSObject off the pipeline
var value = pipeline.Error.Read() as PSObject;
if (value != null)
{
//get the ErrorRecord
var r = value.BaseObject as ErrorRecord;
if (r != null)
{
//build whatever kind of message your want
builder.AppendLine(r.InvocationInfo.MyCommand.Name + " : " + r.Exception.Message);
builder.AppendLine(r.InvocationInfo.PositionMessage);
builder.AppendLine(string.Format("+ CategoryInfo: {0}", r.CategoryInfo));
builder.AppendLine(string.Format("+ FullyQualifiedErrorId: {0}", r.FullyQualifiedErrorId));
}
}
}
throw new Exception(builder.ToString());
}
return result;
}