我的英語太差,無法解釋我想要的東西,但我會嘗試
。有一些非常大的多行字串--sql查詢的一部分
$q =
"Values
(
'$($line.'common.uuid')' 。
'$($line.'user.user_id')' 。
'$($line.'user.ldap.user_attributes.displayName')',
'$($line.'user.email_address')',
'$($line.'common.owner')',
'$($line.'common.current_phone_number')',
'$($line.'common.current_country_name')'。
)"
這個字串非常難以編輯。 有什么方法可以用簡單的方式來做嗎?或者只有像foreach $field in $fields這樣的方法?
$fields = '
common.uuid
user.user_id
user.ldap.user_attributes.displayName
user.email_address
.....'
$q = '()
$line.($fields somehow here)?
)'
可能有大約100行的值,在$fields而不是$q中編輯這個串列要容易得多
。謝謝!
uj5u.com熱心網友回復:
正如Mathias R. Jessen指出的那樣,一般來說,使用引數化SQL查詢比使用字串插值將值烤到查詢字串中更可取,這不僅是為了更好的安全性,也是為了避免非字串值在字串中的往返轉換。
如果你確實想堅持使用字串插值的方法,這里有一個基于.psobject 內在成員的解決方案,它是關于任何物件的豐富反射源,并允許通過.Properties集合列舉其屬性:
# Sample input object.
$line = [pscustomobject] @{
'common.uuid' = '1-2-3'。
'user.user_id' = 'jdoe';
}
# 使用字串插值來嵌入物件的所有屬性值。
$q = @"
值 (
$($line.psobject.Properties.Value.ForEach({ "'" $_ "'" }) -join " ,`n ")
)
"@"。
這個解決方案做出了兩個假設:
你對輸入物件的所有屬性的值感興趣。
你不需要嵌套的屬性訪問(在你問題中的代碼中,諸如
.'user.user_id'的屬性訪問是一個單一的屬性訪問,目標是一個名為verbatimuser.user_id的屬性,盡管這個名稱本身表明一個屬性path(嵌套訪問))。
如果這些假設不成立,請參閱Daniel 的有用回答。
注意,與您的問題一樣,在結果查詢片段中,所有值都表示為字串('...')。
如果你選擇一個引數化的查詢方法,你可以類似地使用 $line.psobject.Properties.Value 來獲得一個所有屬性值的陣列。(請注意,即使.Value被應用于元素的集合,PowerShell也會方便地收集其元素的.Value值,這是一個被稱為成員列舉的功能)。
上面在變數$q中存盤了以下內容:
Values (
'1-2-3',
'jdoe'
)
請參閱這個答案,了解PowerShell通過可擴展字串("...")進行字串插值的概況。
uj5u.com熱心網友回復:
像往常一樣,mklement0提供了一個很好的方法直接在物件的屬性中回圈,盡管你可能必須重新安排sql陳述句以適應屬性的順序和/或添加一些額外的過濾,如果你對物件的所有屬性不感興趣的話。
我將繼續發布我的解決方案,因為它可能會提供一些關于如何完成這一任務的額外見解。
# Example object data。
$lines = @(
@{
common = @{
uuid = 'some uuid'/span>
業主 = 'some owner''222-555-1212'/span>
current_country_name = '美國''some userid'/span>
email_address = '[email protected]'/span>
ldap = @{user_attributes = @{displayName = 'Some User' } }
}
}
@{
普通 = @{
uuid = '一些其他uuid'。
owner = '一些其他的所有者'。
current_phone_number = '222-555-1212'/span>
current_country_name = '英國'/span>
}
user = @{
user_id = 'some other userid'/span>
email_address = '[email protected]'/span>
ldap = @{user_attributes = @{displayName = 'Some other User' } }
}
}
)
# 創建一個我們感興趣的欄位的陣列,# 按照我們希望它們出現在sql陳述句中的順序。
$fields = @(
'common.uuid'。
'user.user_id',
'user.ldap.user_attributes.displayName'。
'user.email_address'。
'common.owner'。
'common.current_phone_number'。
'common.current_country_name')
)
# 回圈瀏覽形成該行的欄位。
# 然后用-join把它們連接起來。
$values = ($fields | ForEach-Object{
"`t'`$(`$line.$_)'"。
}) -join ',`n''。
# 加入其余的陳述句。
$q = "Value (`n $values `n)"
foreach ($line in $lines) {
# 使用ExpandString來擴展里面的變數。
# 我們的$q字串。
$ExecutionContext.InvokeCommand.ExpandString($q)
}
輸出
Values (
'some uuid',
'some userid',
'Some User',
'[email protected]'。
'一些所有者'。
'222-555-1212',
'USA', 'USA'.
)
Values (
'some other uuid',
'some other userid',
'Some other User'。
'[email protected]'。
'其他一些所有者'。
'222-555-1212',
'英國','英國'。
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/326688.html
標籤:
