powerShell.AddCommand的用法

时间:2013-10-28 04:26:26

标签: c# powershell powershell-v2.0 powershell-v3.0

我想使用c#执行此事件。

  

Get-WinEvent -Path'D:\ Events \ myevents.evt'-Oldest |选择-对象    - 财产* | ForEach-Object {$ _ |的ConvertTo JSON的}

我已写到

 path = "D:\\Events\\myevents.evt";  
 var powerShell = PowerShell.Create();
 powerShell.AddCommand("Get-WinEvent");
 powerShell.AddParameter("Path");
 powerShell.AddArgument(path);
 powerShell.AddParameter("Oldest");
 powerShell.AddCommand("Select-Object");
 powerShell.AddParameter("Property");
 powerShell.AddArgument("*");

我坚持写ForEach-Object {$ _ |的ConvertTo JSON的}。让我知道如何继续。

感谢帮助。

2 个答案:

答案 0 :(得分:5)

如果Path来自可靠来源,Keith的答案完全有效。 否则,它可能容易受到脚本注入的影响。 (演示https://gist.github.com/vors/528faab6411db74869d4

我建议一个妥协的解决方案: 将脚本包装在一个函数中,该函数接受动态参数,Invoke使用AddScript()。现在,您在powershell的运行空间/会话中有一个功能。您可以使用AddCommand() + AddParameter()来调用此功能。请记住,您需要在powershell.Commands.Clear()之后调用Invoke,否则将使用管道输入命令。

代码看起来像这样:

const string script = @"function wrapper($path) {return (Get-WinEvent -Path $path -Oldest | Select-Object -Property * | ForEach-Object {$_ | ConvertTo-Json}) }";
ps.AddScript(script);
ps.Invoke();
ps.Commands.Clear();
ps.AddCommand("wrapper").AddParameter("path", path);

答案 1 :(得分:4)

您可以使用AddScript方法:

powershell.AddScript("Get-WinEvent D:\Events\myevents.evt -Oldest | ConvertTo-Json");

我认为您也可以简化该脚本并直接管道转换为ConvertTo-Json。