【问题标题】:Powershell searching many strings at once with a loopPowershell使用循环一次搜索多个字符串
【发布时间】:2023-03-17 07:25:01
【问题描述】:

以下脚本的目的是在特定文件夹中搜索给定的字符串。脚本不会出错。但结果不正确。

如果搜索是单独完成的,搜索一个字符串就可以了。一旦在循环中运行脚本,如果在至少 1 个文件中找到该字符串,我就会得到包含该字符串的文件的正确输出。

问题是当代码在循环中运行并且字符串没有出现在任何文件中时,脚本会返回一堆不存在字符串的文件。如果我单独运行字符串,我不会得到正确的结果。

我设置 FileOut = $null 以防在设置之前只需要清除这个变量但仍然是同样的问题

$a = Get-Date
write-Host $a

$SearchStrings = Get-Content "C:\Users\Someuser\Desktop\DataDumps_PS\Delete_input_2.txt"

$out_file = "C:\Users\Someuser\Desktop\DataDumps_PS\Delete5_$(get-date -f yyyyMMdd).txt"

$RootString = "E:\SSIS_packages\"

Foreach($SearchString in $SearchStrings){

Write-host $SearchString

$FileOut = $null
                                        
$FileOut = Get-ChildItem $RootString -recurse | Select-String -pattern $SearchString | group 
path | Select-Object name,@{name="SearchString"; expression={ 
$SearchString.replace('[','').replace(']','')} } 

$FileOut | Out-file -width 300 -filepath $out_file -append
}

示例输出 使用循环此字符串“DELETE FROM dbo.PRE_GPS_Upload_Status”在输出下方返回。哪个是错的

Name                                                                                  SearchString                          
----                                                                                  ------------                          
E:\SSIS_packages\ENRL_ETL\EWQ_APP\File_Extract_GPS_Fallouts.dtsx                   DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ENRL_ETL\SNP_YearlyVerification\File_Resub_Req_File_Extract.dtsx DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\File_GPS_Data_Pull.dtsx                                 DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\File_GPS_Data_Pull_06072021.dtsx                        DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\File_GPS_Data_Pull_09092019.dtsx                        DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\File_GPS_Data_Pull_09232021.dtsx                        DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\File_GPS_Data_Pull_11162020.dtsx                        DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\Backup\File_GPS_Data_Pull_06.03.2019.dtsx               DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\Backup\File_GPS_Data_Pull_4.2.2019.dtsx                 DELETE FROM  dbo.PRE_GPS_Upload_Status
E:\SSIS_packages\ETL_PNDT\Backup_10112019\File_GPS_Data_Pull_10112019.dtsx        DELETE FROM  dbo.PRE_GPS_Upload_Status

仅搜索 1 个字符串的示例输出(这是正确的输出)

Name                                                                                  SearchString                          
----                                                                                  ------------

对这种行为有什么想法吗?

【问题讨论】:

    标签: powershell powershell-5.1


    【解决方案1】:

    你的Select-String -pattern $SearchString 很可能是罪魁祸首。因为-pattern 使用regular expressions 进行匹配,它可能会看到那些大括号[ ],并匹配文件中的某些内容。尝试将-pattern 换成-SimpleMatch

    【讨论】:

    • 哇,我不敢相信它这么简单。是的,这就是 100% 的答案。我得到了正确的结果。模式参数在循环中的作用有何不同。没有循环,我得到了模式的正确答案?谢谢!
    • @LeoTorres - 此外,您可能会发现使用Select-String-Path 参数比使用Get-ChildItem 更快。它通常要快得多... [grin]
    • @Seb: 很好的推论,但请注意-SimpleMatch 是一个开关,除了 -Pattern(可以是位置绑定),而不是代替它。
    • @LeoTorres,该参数在循环中的作用不会有所不同;可能只有部分搜索字符串包含[]。另请注意,Select-String 接受 多个 模式(模式数组),其中任何一个都可以触发匹配。
    猜你喜欢
    • 2012-03-30
    • 2021-10-25
    • 2015-12-15
    • 2021-03-14
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多