Powershell 命令的输出结果到 C# 变量
Output Result from Powershell command to C# variable
在 c# webforms 应用程序中,我正在尝试 return 当前为我们的 Hyper-V 服务器上的 VM 分配的内存总量。我已经编写了 powershell 命令,并且我有一个经过验证的远程连接到 hyper-v 服务器和 运行 脚本块的方法。我将脚本作为字符串添加,然后使用 ps.addscript(scriptString);
将其插入到管道中
命令运行良好,应用程序中没有错误,但我不知道如何将结果值 return 到 c# 变量(最好是 int)
关于如何执行此操作的任何想法?不使用运行空间,但不知道我是否必须这样做。我只想调用管道,然后将我的输出值添加到 c# 变量。
(出于此 post 的目的,我已将 IP 替换为“1.1.1.1”)
string breakLine = System.Environment.NewLine;
string getHyp1Use = "$hypUN = \"DOMAIN\" + boxUN.Text + "\"" + breakLine +
" $hypPWD =ConvertTo-SecureString \"" + boxPWD.Text + "\" -AsPlainText -Force" + breakLine +
" $hypCREDS = New-Object System.Management.Automation.PSCredential($hypUN, $hypPWD)" + breakLine +
" set-item wsman:\localhost\Client\TrustedHosts -value 1.1.1.1 -force" + breakLine +
" $builderSession = New-PSSession -ComputerName 1.1.1.1 -Credential $hypCREDS" + breakLine +
" Invoke-Command -Session $builderSession -ScriptBlock {Get-VM | Where { $_.State –eq ‘Running’ } | measure MemoryAssigned -Sum | select -ExpandProperty Sum}" + breakLine +
" Invoke-Command -ScriptBlock {Remove-PsSession -Session $builderSession}";
string hyp1Use = null;
PowerShell ps = PowerShell.Create();
ps.AddScript(getHyp1Use);
var results = ps.Invoke();
在您的脚本中,results
变量是 PSObject
的集合。
您可以对其进行迭代并获取 powershell 结果的每个 "columns/properties" 的值...类似于:
var results = ps.Invoke();
foreach (var psobject in results)
{
var myInteger = Convert.ToInt32(psobject.Members["SomeField"].Value);
// do something with `myInteger`
}
每个 PSObject
上的字段取决于 Powershell
返回的对象类型
您可能想尝试利用来自 DLR 的 "dynamic"。使其更易于使用。
static void Main(string[] args)
{
var script = "Get-Process | select -Property @{N='Name';E={$_.Name}},@{N='CPU';E={$_.CPU}}";
var powerShell = PowerShell.Create().AddScript(script);
foreach (dynamic item in powerShell.Invoke().ToList())
{
if (item.CPU > 10) //check if the CPU usage is greater than 10
{
Console.WriteLine("The process greater than 10 CPU counts is : " + item.Name);
}
}
Console.Read();
}
在 c# webforms 应用程序中,我正在尝试 return 当前为我们的 Hyper-V 服务器上的 VM 分配的内存总量。我已经编写了 powershell 命令,并且我有一个经过验证的远程连接到 hyper-v 服务器和 运行 脚本块的方法。我将脚本作为字符串添加,然后使用 ps.addscript(scriptString);
将其插入到管道中命令运行良好,应用程序中没有错误,但我不知道如何将结果值 return 到 c# 变量(最好是 int)
关于如何执行此操作的任何想法?不使用运行空间,但不知道我是否必须这样做。我只想调用管道,然后将我的输出值添加到 c# 变量。
(出于此 post 的目的,我已将 IP 替换为“1.1.1.1”)
string breakLine = System.Environment.NewLine;
string getHyp1Use = "$hypUN = \"DOMAIN\" + boxUN.Text + "\"" + breakLine +
" $hypPWD =ConvertTo-SecureString \"" + boxPWD.Text + "\" -AsPlainText -Force" + breakLine +
" $hypCREDS = New-Object System.Management.Automation.PSCredential($hypUN, $hypPWD)" + breakLine +
" set-item wsman:\localhost\Client\TrustedHosts -value 1.1.1.1 -force" + breakLine +
" $builderSession = New-PSSession -ComputerName 1.1.1.1 -Credential $hypCREDS" + breakLine +
" Invoke-Command -Session $builderSession -ScriptBlock {Get-VM | Where { $_.State –eq ‘Running’ } | measure MemoryAssigned -Sum | select -ExpandProperty Sum}" + breakLine +
" Invoke-Command -ScriptBlock {Remove-PsSession -Session $builderSession}";
string hyp1Use = null;
PowerShell ps = PowerShell.Create();
ps.AddScript(getHyp1Use);
var results = ps.Invoke();
在您的脚本中,results
变量是 PSObject
的集合。
您可以对其进行迭代并获取 powershell 结果的每个 "columns/properties" 的值...类似于:
var results = ps.Invoke();
foreach (var psobject in results)
{
var myInteger = Convert.ToInt32(psobject.Members["SomeField"].Value);
// do something with `myInteger`
}
每个 PSObject
上的字段取决于 Powershell
您可能想尝试利用来自 DLR 的 "dynamic"。使其更易于使用。
static void Main(string[] args)
{
var script = "Get-Process | select -Property @{N='Name';E={$_.Name}},@{N='CPU';E={$_.CPU}}";
var powerShell = PowerShell.Create().AddScript(script);
foreach (dynamic item in powerShell.Invoke().ToList())
{
if (item.CPU > 10) //check if the CPU usage is greater than 10
{
Console.WriteLine("The process greater than 10 CPU counts is : " + item.Name);
}
}
Console.Read();
}