Microsoft 實用程式以下列格式回傳字串:
"Author: First.Last; Name: RootConfiguration; Version: 2.0.0; GenerationDate: 06/01/2022 13:18:10; GenerationHost: Server;"
我想將這些字串轉換為簡單的物件。如果這是真正的 JSON,我只會使用 ConvertFrom-JSON。為了盡可能少地重新發明輪子,將其轉換為物件的最直接方法是什么(使用鍵 Author、Name、Version、GenerationDate、GenerationHost,具有明顯的值。如果這些值都被視為啞字串就可以了。
如果“你只需要通過一口一口地標記字串來磨掉它”是答案,我可以這樣做,但似乎應該有一種更簡單的方法,比如我可以告訴 ConvertFrom-JSON(甚至是 ConvertFrom-String !)“做你的事,但將分號處理為換行符,接受右側的空格等。”
uj5u.com熱心網友回復:
- 將手動決議與 相結合的解決方案
ConvertFrom-StringData,但請注意,不保留條目的輸入順序,因為后者回傳一個[hashtable]具有固有無序條目的實體:
# Sampe input string.
$str = 'Author: First.Last; Name: RootConfiguration; Version: 2.0.0; GenerationDate: 06/01/2022 13:18:10; GenerationHost: Server;'
# Replace ":" with "=", split into individual lines, so
# that ConvertFrom-StringData recognizes the format.
$str -replace ': ', '=' -replace '; ?', "`n" | ConvertFrom-StringData
# Note: The above outputs a [hashtable].
# You could cast it to [pscustomobject], as shown below,
# but the input order of entries is lost either way.
正如zett42指出的那樣,如果輸入字串中的值(而不是鍵)包含\字符,則它們需要加倍才能保留 - 請參閱下面的評論。
- 僅手動決議的解決方案:
# Sampe input string.
$str = 'Author: First.Last; Name: RootConfiguration; Version: 2.0.0; GenerationDate: 06/01/2022 13:18:10; GenerationHost: Server;'
# Initialize an ordered hashtable (dictionary)
$dict = [ordered] @{}
# Split the string by ";", then each entry into key and value by ":".
$str -split '; ?' |
ForEach-Object { $key, $value = $_ -split ': ', 2; $dict[$key] = $value }
# Convert the ordered hashtable (dictionary) to a custom object.
[pscustomobject] $dict
uj5u.com熱心網友回復:
我通常不回答沒有編碼嘗試的問題,但我認為這可能對其他人有所幫助。鑒于分隔符是分號,我正在考慮先轉換為 CSV,但接下來將不得不擔心標題。因此,我們可以使用分隔符來拆分結果并一次處理一個值,而不是轉換為 CSV:
"Author: First.Last; Name: RootConfiguration; Version: 2.0.0; GenerationDate: 06/01/2022 13:18:10; GenerationHost: Server;".Split(";").Trim() |
ForEach-Object -Process {
$header,$value = $_ -split ":",2
New-Object -TypeName PSCustomObject @{
$header = $value
}
} | ConvertTo-Json
為了完成這項作業,我們只需要在第一個冒號 ( :) 處拆分,其余部分保持不變;GenerationDate以防您在物業中看到的其他價值。
- 這是使用
$_ -split ":",2.
最后,剩下的就是將標頭和值分配給 aPSCustomObject并使用ConvertTo-Json.
注意:我的作業系統僅限于“嚴格語言模式”,因此最好使用型別加速器[PSCustomObject]@{..}來創建物件,而不是New-Object.
uj5u.com熱心網友回復:
作為現有有用答案的補充,這里是另一個使用該 Regex.Matches()功能的答案:
$testInput = 'Author: First.Last; Name: RootConfiguration; Version: 2.0.0; GenerationDate: 06/01/2022 13:18:10; GenerationHost: Server;'
# Create a temporary, ordered Hashtable to collect keys and values in the original order.
$ht = [ordered] @{}
# Use a regular expression to find all key/value pairs.
foreach( $match in [regex]::Matches( $testInput, '\s*([^:] ):\s*([^;] );') ) {
# Enter a key/value pair into the Hashtable
$ht[ $match.Groups[1] ] = $match.Groups[2]
}
# Convert the temporary Hashtable to PSCustomObject.
[PSCustomObject] $ht
輸出:
Author : First.Last
Name : RootConfiguration
Version : 2.0.0
GenerationDate : 06/01/2022 13:18:10
GenerationHost : Server
- RegEx 模式由兩個捕獲組組成
( ),其中第一個捕獲一個鍵,第二個捕獲一個值。 - 有關詳細說明,請參閱regex101,您還可以在其中使用該模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/488532.html
