簡體   English   中英

將字符串轉換為 PSCustomObjects 數組

[英]Convert string to array of PSCustomObjects

我正在尋找一種將以下字符串轉換為 PSCustomObjects 數組的智能方法:

Name        : AdtAgent
DisplayName : Microsoft Monitoring Agent Audit Forwarding
Status      : Stopped
StartType   : Disabled
 
Name        : AeLookupSvc
DisplayName : Application Experience
Status      : Running
StartType   : Automatic

任何想法appriciated!

我注意到分隔文本塊的空行並不是真正的空,但它包含一個空格字符。

一種方法是使用ConvertFrom-StringData

$str = @"
Name        : AdtAgent
DisplayName : Microsoft Monitoring Agent Audit Forwarding
Status      : Stopped
StartType   : Disabled

Name        : AeLookupSvc
DisplayName : Application Experience
Status      : Running
StartType   : Automatic
"@ 

$result = $str -split '\r?\n\s*\r?\n' | ForEach-Object {
    # for PowerShell 7 you can use 
    # $_ | ConvertFrom-StringData -Delimiter ':'
    [PsCustomObject](($_ -replace ':', '=') | ConvertFrom-StringData)
}

$result

Output:

Status  DisplayName                                 StartType Name       
------  -----------                                 --------- ----       
Stopped Microsoft Monitoring Agent Audit Forwarding Disabled  AdtAgent   
Running Application Experience                      Automatic AeLookupSvc

但是,如果重要的話,這不會保持屬性的順序,而且,如果您的值可能包含“:”字符,這可能會給您帶來不好的結果。

您當然可以像這樣“手動”執行此操作,如果值具有冒號字符,則保持順序並且不會混淆:

$result = $str -split '\r?\n\s*\r?\n' | ForEach-Object {
    $hash = [ordered]@{}
    foreach ($line in ($_ -split '\r?\n')) {
        $name, $value = ($line -split ':', 2).Trim()
        $hash[$name] = $value
    }
    # cast to PsCustomObject for output
    [PsCustomObject]$hash 
}

$result

Output:

Name        DisplayName                                 Status  StartType
----        -----------                                 ------  ---------
AdtAgent    Microsoft Monitoring Agent Audit Forwarding Stopped Disabled 
AeLookupSvc Application Experience                      Running Automatic

您可以使用 convertfrom-stringdata 命令行開關

$array = (@"
Name        : AdtAgent
DisplayName : Microsoft Monitoring Agent Audit Forwarding
Status      : Stopped
StartType   : Disabled

Name        : AeLookupSvc
DisplayName : Application Experience
Status      : Running
StartType   : Automatic
"@ -split "`r`n`r`n") | ConvertFrom-StringData -Delimiter ":"

在將其格式化為列表之前,您能否獲得原始數據? 如果是這樣,那可能比將其轉換為文本然后再返回對您更有用。 感謝@zett42 的建議。

考慮以下:

$svc = Get-Service | Select-Object -property Name, Displayname, Status, StartType

現在,如果你這樣做:

$svc | Format-List

你會得到看起來像你給我們的樣本的文本。

但如果你這樣做:

$svc | gm

您會注意到這是一個 ServiceController 數組。 這對您來說可能與 PSCustomObject 數組一樣有用。 或者,您可以將其直接轉換為 PSCustomObject 數組,而無需再轉回文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM