c# - 如何在 C# 中获取 PSObject.Properties 的 ScriptProperty 值?
问题描述
我正在尝试使用“GET-PSDrive”命令通过 PowerShell 6.0 获取服务器的驱动器信息。直接在 PowerShell 中运行命令,我在输出表中看到了“Used”和“Free”的值,但是虽然使用 Microsoft.Powershell.Sdk 在代码中运行相同的命令,但“Used”和“Free”字段不是可用的。
我看到 PSObject.Properties 数组下列出了这两个项目,但尝试访问我收到异常的值:
“在此线程中没有可用于运行脚本的运行空间。您可以在 System.Management.Automation.Runspaces.Runspace 类型的 DefaultRunspace 属性中提供一个。您尝试调用的脚本块是:##”
以下是我正在使用的 POC 代码:
using (var psCon = PowerShell.Create())
{
psCon.AddCommand("GET-PSDrive");
var psReturn = psCon.Invoke();
foreach (var psObj in psReturn)
{
var driveUsedValue = psObj.Properties["Used"].Value;
}
}
我期望获得该属性的值,但每次评估该值时,我都会收到一条错误消息,指出没有可用的运行空间。检查属性我确实看到它是一个 ScriptProperty,那么你如何获取生成的值呢?
解决方案
使用的属性是一个称为 ScriptProperty。这意味着当它被调用时,它会运行一个脚本。我们可以通过调用看到这一点:
get-PSDrive | get-member -Name Used
这返回
Name MemberType Definition
---- ---------- ----------
Used ScriptProperty System.Object Used {get=## Ensure that this is a FileSystem drive...
我们可以深入挖掘并查看正在运行的脚本
get-PSDrive | get-member -Name Used | select -ExpandProperty Definition
这将返回
System.Object Used {
get=## Ensure that this is a FileSystem drive
if($this.Provider.ImplementingType -eq [Microsoft.PowerShell.Commands.FileSystemProvider]){
$driveRoot = ([System.IO.DirectoryInfo] $this.Root).Name.Replace('\','')
$drive = Get-CimInstance Win32_LogicalDisk -Filter "DeviceId='$driveRoot'"
$drive.Size - $drive.FreeSpace
};
}
这就是你得到异常的原因There is no Runspace available to run scripts in this thread
。这是因为该信息运行需要运行空间的脚本。
要解决此问题,您可以将所有属性转换为这样的注释属性
Get-PSDrive | %{
$drive = $_
$obj = new-object psobject
$_.psobject.Properties.GetEnumerator() | %{
$obj | Add-Member -MemberType NoteProperty -name $_.Name -Value $drive."$($_.name)"
}
$obj
}
或者正如@mklement0 在评论中指出的那样
Get-PSDrive | Select-Object *
这是更好的解决方案。
它将返回一个 PSobjects 数组,其值作为注释而不是脚本
using (var psCon = PowerShell.Create()){
psCon.AddScript(@"
Get-PSDrive | Select-Object *
");
var psReturn = psCon.Invoke();
foreach (var psObj in psReturn)
{
var driveUsedValue = psObj.Properties["Used"].Value;
}
}
*请注意,该值将只是使用的字节整数。
推荐阅读
- python - 如何在 django 中实现多级管理?
- python - 在 Jupyter Lab 笔记本中使用 PyMongo 不会关闭与 MongoDB 服务器的任何连接
- html - 在浮动 div 周围环绕文本(和图像)
- html - 如何始终将我的页脚设置在底部是否可以仅使用 css
- node.js - 如何安装具有私有 npm 依赖项的链代码(私有存储库)
- java - 在 spring-kafka 中为多个 KafkaListener 实现共享逻辑
- ruby-on-rails - 如何在不保存的情况下更新尚未保存的对象?
- c# - XML-RPC 如何将 C# 字符串转换为 java.lang.String
- android - ViewPager 动画片段内的视图
- python - Sci-kit 学习如何打印混淆矩阵的标签?