创建搜索功能以仅在用户输入时支持通配符

create search function to support wildcard char only when it is input by user

我正在编写一个函数来搜索(不区分大小写)CSV 文件。为了对此进行测试,我使用了一个数组,并使用用户输入来检查该数组。如果用户输入一个 wildstar 并且它的位置也很重要,我只希望搜索包括一个 wildstar。

例如(在伪代码中),给定 $array = "Hanna", "Anna", "Ann"

if userInput = Ann
output = "Ann"

If userInput = Ann*
output = "Ann", "Anna"

if userInput = *nna
output = "Anna"

if userInput = *nn*
output = "Hannah", "Anna", "Ann"

if userInput = *Hanna*
output = "Hanna"

if userInput = Hanna
output = "Hanna"

等等...

我正在使用 CSV 文件 test1.csv:

test1Column1,test1Column2,test1Column3
Hannah,12345,
Anna,1234,
Ann,2345,

我有以下代码:

Function SearchContentName
{
    Param ($userSearchContent)

    If ($userSearchContent -Contains '`*')
    {
        Import-Csv test1.csv | % {if ($_.test1Column1 -Match $userSearchContent){$_.test1Column1}} | Export-Csv testresults.csv -NoTypeInformation
    }
    ElseIf ($userSearchContent -NotContains '`*')
    {
        Import-Csv test1.csv | % {if ($_.test1Column1 -Eq $userSearchContent){$_.test1Column1}} | Export-Csv testresults.csv -NoTypeInformation
    }
}

Function Main
{
    $userSearchContent = Read-Host "Enter Name"

    SearchContentName $userSearchContent
}

Main

谁能告诉我我做错了什么?

您使用了错误的运算符。由于您想允许通配符匹配,只需对所有用户输入使用 -like

Function SearchContentName {
    Param ($userSearchContent)

    Import-Csv test1.csv | ForEach-Object {
        if ($_.test1Column1 -like $userSearchContent) {
            $_.test1Column1
        }
    } | Set-Content testresults.csv
}

-match 运算符用于正则表达式,您必须将 "any number of characters" 表示为 .*,而不仅仅是 *。如果 $userSearchContent 不包含通配符,则 -like 运算符的行为类似于 -eq,因此您无需区分不同的情况。

如果您希望输出 CSV 包含整行并且 headers,请使用 Where-Object 而不是使用嵌套在 ForEach-Object 中的 if 进行过滤:

Function SearchContentName {
    Param ($userSearchContent)

    Import-Csv test1.csv | Where-Object {
        $_.test1Column1 -like $userSearchContent
    } | Export-Csv testresults.csv -NoType
}