Вызванная команда PS для строки
Есть ли способ преобразовать вызванную команду 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");
И я хотел бы сохранить запущенную команду в файл журнала.
Могу ли я как-то вернуть всю команду в виде строки?
2 ответа
Я считаю, что по сути вы хотите этого.
PowerShell ps = PowerShell.Create();
ps.AddScript($"Add-VpnConnection -Name \"VPN_{ClientName}\" -ServerAddress {VPNServerIP} -AllUserConnection -SplitTunneling -TunnelType L2tp");
ps.Invoke();
Возврат вызова будет содержать коллекцию PSObject, чтобы вы могли прочитать его и сохранить информацию, как вы хотите, в журнале на C#.
Примечание. Этот ответ не решает проблему OP. Вместо этого он показывает, как записать вывод команды PowerShell в виде строки на C#, отформатированной таким же образом, как вывод команды выводился бы на дисплей (консоль), если бы он был запущен в интерактивном сеансе PowerShell.
Out-String
- это командлет, который создает отформатированные для отображения представления объектов вывода в виде строк, как если бы они выводились на экран в консоли PowerShell.
Поэтому вам просто нужно использовать другой .AddCommand()
чтобы передать вывод из вашего Add-VpnConnection
позвонить Out-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);