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
。
下面脚本的目的是在特定文件夹中搜索给定的字符串。脚本不会出错。但是结果不正确。
如果搜索是单独完成的,搜索一个字符串就可以了。一旦脚本在循环中 运行 如果在至少 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
。