1

呼び出された powershell コマンドを C# から文字列に変換する方法はありますか?

たとえば、次のようなものがあるとしましょう。

PowerShell ps = PowerShell.Create();
                    ps.AddCommand("Add-VpnConnection");
                    ps.AddParameter("Name", "VPN_" + ClientName);
                    ps.AddParameter("ServerAddress", VPN_SERVER_IP);
                    ps.AddParameter("AllUserConnection");
                    ps.AddParameter("SplitTunneling", true);
                    ps.AddParameter("TunnelType", "L2tp");

そして、呼び出されたコマンドをログファイルに保存したいと思います。

コマンド全体を文字列として返すことはできますか?

4

2 に答える 2

1

あなたが本質的に望んでいるのはこれだと思います。

PowerShell ps = PowerShell.Create();
ps.AddScript($"Add-VpnConnection -Name \"VPN_{ClientName}\" -ServerAddress {VPNServerIP} -AllUserConnection -SplitTunneling -TunnelType L2tp");
ps.Invoke();

呼び出しの戻り値には PSObject のコレクションが含まれるため、それを読み取って、C# のログに必要な情報を保存できます。

于 2020-07-13T23:07:08.257 に答える
0

注:この回答はOPの問題を解決しません。代わりに、対話型の PowerShell セッションで実行された場合にコマンドの出力がディスプレイ(コンソール)に出力されるのと同じ方法で書式設定された、PowerShell コマンドの出力を C# の文字列としてキャプチャする方法を示します。


Out-StringPowerShell コンソールの画面に出力されるように、出力オブジェクトの書式設定された表示用の表現をstring として生成するコマンドレットです。

したがって、呼び出しから.AddCommand()の出力を にパイプするには、別のものを使用する必要があります。Add-VpnConnectionOut-String

string formattedOutput;
using (PowerShell ps = PowerShell.Create())
{

  ps.AddCommand("Add-VpnConnection")
    .AddParameter("Name", "VPN_" + ClientName)
    .AddParameter("ServerAddress")
    .AddParameter("AllUserConnection", VPN_SERVER_IP)
    .AddParameter("SplitTunneling", true)
    .AddParameter("TunnelType", "L2tp");

  // Add an Out-String call to which the previous command's output is piped to.
  // Use a -Width argument (column count) large enough to show all data.
  ps.AddCommand("Out-String").AddParameter("Width", 512);

  // Due to use of Out-String, a *single string* is effectively returned,
  // as the only element of the output collection.
  formattedOutput = ps.Invoke<string>()[0];

}

Console.Write(formattedOutput);
于 2020-07-14T03:17:51.693 に答える