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 的问题。相反,它展示了如何在 C# 中将 PowerShell 命令的输出捕获为字符串,其格式与命令输出在交互式 PowerShell 会话中运行时打印到显示器(控制台)的方式相同。


Out-String是 cmdlet,它将输出对象的格式化、用于显示的表示形式生成为字符串,因为它们将在 PowerShell 控制台中打印到屏幕上。

因此,您只需要使用另一个来将调用.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 回答