簡體   English   中英

為什么類似於 Powershell 的運算符與我的字符串不匹配?

[英]Why does the Powershell -like operator not match my string?

這里我有 2 個變量: $repo$growth_repo_name_list 這是每個的output:

> $repo
growth_medicare_consumertargetinganalyzer

> $growth_repo_name_list
2021.2
growth_ifp_consumersummary_v2
growth_ifp_consumertargetinganalyzer
growth_medicare_all_usconsumerattributes
growth_medicare_consumersummary_v2
growth_medicare_consumertargetinganalyzer
growth_medicare_growthopportunityindex
growth_medicare_ifp_all_usconsumerattributes
growth_medicare_ntmtargetinganalyzer
marketintel_medicare_historicalenrollmentanalyzer
marketintel_medicare_planbenefits
memberintel_ifp_aepoepreporting_v2
memberintel_ifp_memberreporting_v2
memberintel_medicaid_memberreporting_v2
memberintel_medicare_aepoepreporting_v2
memberintel_medicare_memberreporting_v2

$repo是一個字符串, $growth_repo_name_list是一個字符串數組:

> $repo.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

> $growth_repo_name_list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

$repo沒有隱藏字符,如下代碼的 output 所示:

> [System.Text.Encoding]::UTF8.GetBytes($repo)
103
114
111
119
116
104
95
109
101
100
105
99
97
114
101
95
99
111
110
115
117
109
101
114
116
97
114
103
101
116
105
110
103
97
110
97
108
121
122
101
114

> [System.Text.Encoding]::UTF8.GetBytes($growth_repo_name_list[5])
103
114
111
119
116
104
95
109
101
100
105
99
97
114
101
95
99
111
110
115
117
109
101
114
116
97
114
103
101
116
105
110
103
97
110
97
108
121
122
101
114

即使我通過雙引號將 Array 轉換為平面字符串,它仍然返回False

> "$growth_repo_name_list"
2021.2 growth_ifp_consumersummary_v2 growth_ifp_consumertargetinganalyzer growth_medicare_all_usconsumerattributes growth_medicare_consumersummary_v2 growth_medicare_consumertargetinganalyzer growth_medicare_growthopportunityindex growth_medicare_ifp_all_usconsumerattributes growth_medicare_ntmtargetinganalyzer marketintel_medicare_historicalenrollmentanalyzer marketintel_medicare_planbenefits memberintel_ifp_aepoepreporting_v2 memberintel_ifp_memberreporting_v2 memberintel_medicaid_memberreporting_v2 memberintel_medicare_aepoepreporting_v2 memberintel_medicare_memberreporting_v2

> $ph = "$growth_repo_name_list"

> $repo -like $ph
False

> $ph.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

我在這里做錯了什么? 比較的結果應該是True因為字符串$repo包含在列表$growth_repo_name_list中。 我在這里先向您的幫助表示感謝。

所有的比較都會產生$True ,你可能把它們比較錯了嗎?

about_Comparison_Operators中提取:

當輸入是一個集合時,運算符返回集合中與表達式右側值匹配的元素。 如果集合中沒有匹配項,則比較運算符返回一個空數組

$repo = 'growth_medicare_consumertargetinganalyzer'

$growth_repo_name_list = @(
    '2021.2'
    'growth_ifp_consumersummary_v2'
    'growth_ifp_consumertargetinganalyzer'
    'growth_medicare_all_usconsumerattributes'
    'growth_medicare_consumersummary_v2'
    'growth_medicare_consumertargetinganalyzer'
    'growth_medicare_growthopportunityindex'
    'growth_medicare_ifp_all_usconsumerattributes'
    'growth_medicare_ntmtargetinganalyzer'
    'marketintel_medicare_historicalenrollmentanalyzer'
    'marketintel_medicare_planbenefits'
    'memberintel_ifp_aepoepreporting_v2'
    'memberintel_ifp_memberreporting_v2'
    'memberintel_medicaid_memberreporting_v2'
    'memberintel_medicare_aepoepreporting_v2'
    'memberintel_medicare_memberreporting_v2'
)

[bool]($growth_repo_name_list -like $repo)  # => True
$repo -in $growth_repo_name_list            # => True
$growth_repo_name_list -contains $repo      # => True
[bool]($growth_repo_name_list -match $repo) # => True
$growth_repo_name_list.Contains($repo)      # => True

tl;博士

# Is the value of $repo equal to at least one element of array $growth_repo_name_list?
$repo -in $growth_repo_name_list

筆記:

  • 默認情況下, -in執行的每個元素相等比較不區分大小寫,就像 PowerShell 通常一樣。

  • 但是,您可以在運算符名稱前加上c以使其區分大小寫(在上面的示例中為-cin 。這適用於所有字符串處理運算符,包括下面討論的運算符。


至於你嘗試了什么:

$repo -like $ph ( $ph"$growth_repo_name_list" )
比較的結果應該是$true因為字符串$repo在列表$growth_repo_name_list

否: -like 通配符匹配運算符既不執行(直接) substring匹配,也不支持與 RHS 字符串數組匹配。

  • 相反,它將 LHS(單個輸入字符串或輸入字符串數組)與 RHS 上的單個通配符表達式進行比較。
  • 如果您不小心將數組用作 RHS,則數組是stringified ,通過將(字符串化的)數組元素與它們之間的單個空格連接起來以形成單個字符串 - 這很少有幫助。

因此,直接的解決方法是反轉操作數

# *Array* of string inputs. 
# Return those array elements that match the wildcard expression stored in $repo
$growth_repo_name_list -like $repo

這會將數組$growth_repo_name_list每個元素與 $ $repo中的通配符表達式進行比較,並返回匹配元素的子數組

Boolean上下文中使用返回數組(例如if ($growth_repo_name_list -like $repo)... )如果子數組為則轉換為$false ,否則轉換為$true

但是, $repo在您的情況下只是一個字符串文字(它不包含通配符元字符,例如*? ),因此沒有理由使用-like - 只需使用-eq

# *Array* of string inputs. 
# Return those array elements that are case-insensitively equal to the
# string stored in $repo.
$growth_repo_name_list -eq $repo

相反,如果您想將$repo的值匹配為數組元素的substring

# *Array* of string inputs. 
# Return those array elements that case-insensitively contain the
# string stored in $repo as a substring (or in full).
$growth_repo_name_list -lik "*$repo*"

退后一步:您似乎只是想測試$repo的值是否包含在$growth_repo_name_list中存儲的數組中,即該值是否完全等於(至少)大批。

為此,PowerShell 提供了兩個功能等效的運算符-in-contains ,它們僅在操作數順序上有所不同:

# Is the value of $repo equal to at least one element of array $growth_repo_name_list?
$repo -in $growth_repo_name_list

# Ditto, operands reversed.
$growth_repo_name_list -contains $repo

這些運算符直接返回 Boolean 值( $true$false )。

暫無
暫無

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

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