[英]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.