powerShell.AddCommand的用法

Sac*_*dar 5 c# powershell powershell-2.0 powershell-3.0

我想用c#执行这个事件.

Get-WinEvent -Path'D:\ Events\myevents.evt'-Oldest | Select-Object -Property*| 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("*");
Run Code Online (Sandbox Code Playgroud)

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

感谢帮助.

xvo*_*rsx 5

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

我建议一个妥协的解决方案:将脚本包装在一个函数中,该函数采用动态参数和InvokeAddScript().现在,您在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);
Run Code Online (Sandbox Code Playgroud)


Kei*_*ill 3

你可以只使用以下AddScript方法:

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

我认为您还可以简化该脚本并直接通过管道传输到 ConvertTo-Json。

  • `powershell.AddScript(String.Format("Get-WinEvent '{0}' ...", path));` (2认同)
  • @KeithHill 那么你需要担心脚本注入,如果路径可以来自作者代码的外部。 (2认同)