8

私はSystem.Management.AutomationDLLを使用しています。これにより、C#アプリケーション内でPowerShellを次のように呼び出すことができます。

PowerShell.Create().AddScript("Get-Process").Invoke();

私がやろうとしているのは、PowerShellを呼び出すことですが、入力リストを提供します。たとえば、次のようになります。

1, 2, 3 | ForEach-Object { $_ * 2 }

1, 2, 3呼び出すときに左側を供給しようとしています:

// powershell is a PowerShell Object
powershell.Invoke(new [] { 1, 2, 3 });

ただし、これは機能しません。私が思いついた回避策は、配列を使用してから、:として配列ForEach-Objectを渡すことでした。InputObject{ $_ }Process

// create powershell object
var powershell = PowerShell.Create();

// input array 1, 2, 3
Command inputCmd = new Command("ForEach-Object");
inputCmd.Parameters.Add("InputObject", new [] { 1, 2, 3 });
inputCmd.Parameters.Add("Process", ScriptBlock.Create("$_"));
powershell.Commands.AddCommand(inputCmd);

// ForEach-Object { $_ * 2 }
Command outputCmd = new Command("ForEach-Object");
outputCmd.Parameters.Add("Process", ScriptBlock.Create("$_ * 2"));
powershell.Commands.AddCommand(outputCmd);

// invoke
var result = powershell.Invoke();

上記は機能するコードですがInvoke、入力配列の受け渡しを使用する方法はありますか?これは、これを呼び出すための望ましい方法であると思いますか?

4

2 に答える 2

13

少し遅れましたが:

PowerShell ps = PowerShell.Create();
ps.Runspace.SessionStateProxy.SetVariable("a", new int[] { 1, 2, 3 });
ps.AddScript("$a");
ps.AddCommand("foreach-object");
ps.AddParameter("process", ScriptBlock.Create("$_ * 2"));
Collection<PSObject> results = ps.Invoke();
foreach (PSObject result in results)
{
    Console.WriteLine(result);
}

戻り値:

2
4
6
于 2012-11-25T21:02:51.733 に答える
2

私は調査を行い、リストの最初のコマンドのPowerShell.Invoke( IEnumerable )を設定します。InputObjectしたがって、上記で設定InputObjectする代わりに、代わりにメソッドinputCmdを介して渡すことができます。入力配列を渡すInvoke最初の呼び出しがまだ必要です。ForEach-Object

于 2012-11-06T15:10:22.640 に答える