Powershell 使用循环一次搜索多个字符串

Powershell searching many strings at once with a loop

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

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

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

我设置了 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”returns。哪个是错误的

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                          
----                                                                                  ------------

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

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