我從 SSAS 模型中獲取了一個資料集,通過AdomdClient它為我提供了一個物件,該物件的屬性名稱中帶有方括號。這使我無法使用Select-Object僅選擇屬性的子集(或更具體地說,使用計算的屬性來重命名它們,以便它們與另一個資料集/obj 匹配)
我知道在檔案名中使用方括號的問題,并嘗試轉義方括號。理想情況下,我想了解處理這些屬性的 powershell 方法,盡管任何解釋如何在adomdclient不帶括號的情況下回傳資料的方法的答案也對我重命名屬性的特定目標非常有幫助。
下面的代碼片段可以在沒有 SSAS/adomdclient 依賴項的情況下重新創建我所看到的內容。由于程式集依賴性,我為此代碼使用 powershell 5.1:
$bracketedTestObj = New-Object PSObject -Property @{
"MyProperty[WithBrackets]" = "bracketedValue"
"MyPropertyWithoutBrackets" = "nonbracketedValue"
}
Write-host "The whole obj"
$bracketedTestObj | ft
Write-host "Select just the non bracketed property"
$bracketedTestObj | select-Object "MyPropertyWithoutBrackets" | ft
# I cannot figure out how to escape the [] and select only the bracketed property
Write-host "Select just the bracketed property"
$bracketedTestObj | select-Object "MyProperty[WithBrackets]" | ft
Write-host "Select just the bracketed property, 1 backtick"
$bracketedTestObj | select-Object "MyProperty`[WithBrackets`]" | ft
Write-host "Select just the bracketed property, 2 backtick"
$bracketedTestObj | select-Object "MyProperty``[WithBrackets``]" | ft
Write-host "Select just the bracketed property, 3 backtick"
$bracketedTestObj | select-Object "MyProperty```[WithBrackets```]" | ft
Write-host "Select just the bracketed property, 4 backtick"
$bracketedTestObj | select-Object "MyProperty````[WithBrackets````]" | ft
結果(我沒有包含超過`反引號的結果,但結果是一樣的:
The whole obj
MyPropertyWithoutBrackets MyProperty[WithBrackets]
------------------------- ------------------------
nonbracketedValue bracketedValue
Select just the non bracketed property
MyPropertyWithoutBrackets
-------------------------
nonbracketedValue
Select just the bracketed property
MyProperty[WithBrackets]
------------------------
Select just the bracketed property, 1 backtick
MyProperty[WithBrackets]
------------------------
uj5u.com熱心網友回復:
據我所知,有沒有辦法強制Select-Object給不試圖擴大在屬性名通配符序列。
最安全的解決方法是使用計算屬性來評估輸入項上的目標屬性:
$object = [pscustomobject]@{
'MyProperty[WithBrackets]' = 123
'OtherProperty' = 456
}
$object |Select-Object @{Name='MyProperty[WithBrackets]';Expression={$_.'MyProperty[WithBrackets]'}}
為了保持 DRY,您可能需要撰寫一個小的實用程式函式來生成這樣的計算屬性定義:
function New-LiteralPropertySelector {
param([string[]]$PropertyName)
foreach($name in $PropertyName){
if([WildcardPattern]::ContainsWildcardCharacters($name)){
# Property name contains wildcard characters -> special handling required
Write-Output @{Name=$name;Expression={$_.$name}.GetNewClosure()}
}
else {
# No wildcards, return as-is
Write-Output $name
}
}
}
現在你可以這樣做:
$object = [pscustomobject]@{
'MyProperty[WithBrackets]' = 123
'OtherProperty' = 456
'ImportantProperty' = 789
}
$object |Select-Object @(New-LiteralPropertySelector 'MyProperty[WithBrackets]','ImportantProperty')
并得到預期的結果:
MyProperty[WithBrackets] ImportantProperty
------------------------ -----------------
123 789
uj5u.com熱心網友回復:
如果括號是通配符的一部分,例如Select-Object MyProp*,那么也許......
PS C:\> $bracketedTestObj|Select-Object 'MyProperty[[]WithBrackets[]]'
MyProperty[WithBrackets]
------------------------
bracketedValue
[編輯:這感覺它不應該作業,就像[]]應該打破它,或者整個外部[...]應該以亂序排列其中的任何字母,但快速測驗似乎沒有發生這些問題]。
一種解決方法,匹配單個字符的通配符:
Select-Object "MyProperty?WithBrackets?"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405493.html
標籤:
