1 回答
TA贡献1853条经验 获得超9个赞
Used 属性称为 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;
}
}
*注意该值将只是使用的字节整数。
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报