我想使用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的}。让我知道如何继续。
感谢帮助。
答案 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。