亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 C# 中獲取 PSObject.Properties 的 ScriptProperty 值?

如何在 C# 中獲取 PSObject.Properties 的 ScriptProperty 值?

C#
喵喵時光機 2022-12-24 11:47:04
我正在嘗試使用“GET-PSDrive”命令通過 PowerShell 6.0 獲取服務器的驅動器信息。直接在 PowerShell 中運行命令,我在輸出表中看到“已用”和“免費”的值,但在代碼中運行相同的命令雖然使用 Microsoft.Powershell.Sdk,但“已用”和“免費”字段不是可用的。我看到 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,那么您如何獲取生成的值呢?
查看完整描述

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;

    }

}

*注意該值將只是使用的字節整數。


查看完整回答
反對 回復 2022-12-24
  • 1 回答
  • 0 關注
  • 146 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號