[英]Specify multiple patterns in Select-string
我无法正确格式化选择字符串,以便可以使用多种模式。 我还试图以我的模式来隐藏\\。 其使用目录路径。
这些是我需要搜索的模式:
Successfully FTPed file [\\BATCH1\TO\DENIAL.TXT
Successfully FTPed file [\\BATCH1\TO\NEWORIGIN.TXT
Successfully FTPed file [\\BATCH1\TO\ORIGIN.TXT
Successfully FTPed file [\\BATCH1\TO\Ed.TXT
此代码仅适用于单个模式搜索。
Get-ChildItem -Filter FTP_Outbound*.* -Path $rootFolder| Where-Object {$_.LastWriteTime -gt (get-date).AddDays(-.5)}| Select-String -pattern ([regex]::Escape('Successfully FTPed file [\\BATCH1\CFGP\TO\DENIAL.TXT'))| % {
Copy-Item -Path $_.Path -Destination 'c:\Temp'
}
最后,我希望将文件复制到C:\\ Temp,并在powershell窗口中显示在文件中找到的行。
样本数据:
[11:18:24 PM] Begin SFTP File \\BATCH1\TO\BRRef[20190724202940].txt To BRRef.txt
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\DENIAL.TXT[20190724194428]] to [\DENIAL.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\NEWORIGIN.TXT[20190724194428]] to [\NEWORIGIN.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\ORIGIN.TXT[20190724194428]] to [\ORIGIN.TXT]
[11:18:48 PM] Successfully FTPed file [\\BATCH1\TO\BRRef[20190724202940].txt] to [\BRRef.txt]
[11:18:48 PM] Update ProducedFile Set DeliveredFileName='BRRef.txt' Where CreateID=7710395
[11:18:48 PM] Successfully backed up file as :\\BATCH1\TO_BACKUP\BRRef[20190724202940]_20190724_231848.txt
FILE #2. [Ed.TXT[20190724194428]], begin FTP at [11:19:05 PM]
Destination file name is: Ed.TXT[20190724194428]
After replaceing [], destination file name become: Ed.TXT
[11:19:05 PM] Begin SFTP File \\BATCH1\TO\Ed.TXT[20190724194428] To Ed.TXT
[11:19:07 PM] Successfully FTPed file [\\BATCH1\TO\Ed.TXT[20190724194428]] to [\Ed.TXT]
[11:19:07 PM] Update ProducedFile Set DeliveredFileName='Ed.TXT' Where CreateID=7710363
[11:19:07 PM] Successfully backed up file as :\\BATCH1\TO_BACKUP\Ed_20190724_231907.TXT[20190724194428]
假设您只希望与这4个路径\\文件名匹配的4行, Successfully FTPed file
在该行中具有Successfully FTPed file
,这似乎可行。 [ 咧嘴 ]
# fake reading in a text file
# in real life, use Get-Content
$InStuff = @'
[11:18:24 PM] Begin SFTP File \\BATCH1\TO\BRRef[20190724202940].txt To BRRef.txt
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\DENIAL.TXT[20190724194428]] to [\DENIAL.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\NEWORIGIN.TXT[20190724194428]] to [\NEWORIGIN.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\ORIGIN.TXT[20190724194428]] to [\ORIGIN.TXT]
[11:18:48 PM] Successfully FTPed file [\\BATCH1\TO\BRRef[20190724202940].txt] to [\BRRef.txt]
[11:18:48 PM] Update ProducedFile Set DeliveredFileName='BRRef.txt' Where CreateID=7710395
[11:18:48 PM] Successfully backed up file as :\\BATCH1\TO_BACKUP\BRRef[20190724202940]_20190724_231848.txt
FILE #2. [Ed.TXT[20190724194428]], begin FTP at [11:19:05 PM]
Destination file name is: Ed.TXT[20190724194428]
After replaceing [], destination file name become: Ed.TXT
[11:19:05 PM] Begin SFTP File \\BATCH1\TO\Ed.TXT[20190724194428] To Ed.TXT
[11:19:07 PM] Successfully FTPed file [\\BATCH1\TO\Ed.TXT[20190724194428]] to [\Ed.TXT]
[11:19:07 PM] Update ProducedFile Set DeliveredFileName='Ed.TXT' Where CreateID=7710363
[11:19:07 PM] Successfully backed up file as :\\BATCH1\TO_BACKUP\Ed_20190724_231907.TXT[20190724194428]
'@ -split [System.Environment]::NewLine
$TargetOne = 'Successfully FTPed file'
$TargetTwo = @(
'\\BATCH1\TO\DENIAL.TXT'
'\\BATCH1\TO\NEWORIGIN.TXT'
'\\BATCH1\TO\ORIGIN.TXT'
'\\BATCH1\TO\Ed.TXT'
)
<# disabled due to one server with ps3
$T2_Regex = $TargetTwo.ForEach({
[regex]::Escape($_)
}) -join '|'
#>
# this pipeline version otta work with ps3
$T2_Regex = ($TargetTwo |
ForEach-Object {
[regex]::Escape($_)
}) -join '|'
$InStuff |
Where-Object {
$_ -match $TargetOne -and
$_ -match $T2_Regex
}
输出...
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\DENIAL.TXT[20190724194428]] to [\DENIAL.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\NEWORIGIN.TXT[20190724194428]] to [\NEWORIGIN.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\ORIGIN.TXT[20190724194428]] to [\ORIGIN.TXT]
[11:19:07 PM] Successfully FTPed file [\\BATCH1\TO\Ed.TXT[20190724194428]] to [\Ed.TXT]
我建议您通过RegEx比赛来做到这一点。
例如:使用RegEx进行基于简单模式匹配的多个匹配
Clear-Host
$MyString = @'
[11:18:24 PM] Begin SFTP File \\BATCH1\TO\BRRef[20190724202940].txt To BRRef.txt
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\DENIAL.TXT[20190724194428]] to [\DENIAL.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\NEWORIGIN.TXT[20190724194428]] to [\NEWORIGIN.TXT]
[11:18:44 PM] Successfully FTPed file [\\BATCH1\TO\ORIGIN.TXT[20190724194428]] to [\ORIGIN.TXT]
[11:18:48 PM] Successfully FTPed file [\\BATCH1\TO\BRRef[20190724202940].txt] to [\BRRef.txt]
[11:18:48 PM] Update ProducedFile Set DeliveredFileName='BRRef.txt' Where CreateID=7710395
[11:18:48 PM] Successfully backed up file as :\\BATCH1\TO_BACKUP\BRRef[20190724202940]_20190724_231848.txt
FILE #2. [Ed.TXT[20190724194428]], begin FTP at [11:19:05 PM]
Destination file name is: Ed.TXT[20190724194428]
After replaceing [], destination file name become: Ed.TXT
[11:19:05 PM] Begin SFTP File \\BATCH1\TO\Ed.TXT[20190724194428] To Ed.TXT
[11:19:07 PM] Successfully FTPed file [\\BATCH1\TO\Ed.TXT[20190724194428]] to [\Ed.TXT]
[11:19:07 PM] Update ProducedFile Set DeliveredFileName='Ed.TXT' Where CreateID=7710363
[11:19:07 PM] Successfully backed up file as :\\BATCH1\TO_BACKUP\Ed_20190724_231907.TXT[20190724194428]
'@
$MyRegExMatch = 'Successfully FTPed.*?TXT'
([regex]::Matches($MyString,$MyRegExMatch).Value)
# Results
<#
Successfully FTPed file [\\BATCH1\TO\DENIAL.TXT
Successfully FTPed file [\\BATCH1\TO\NEWORIGIN.TXT
Successfully FTPed file [\\BATCH1\TO\ORIGIN.TXT
Successfully FTPed file [\\BATCH1\TO\Ed.TXT
#>
要么
Clear-Host
$MyRegExMatch = 'Successfully FTPed.*?TXT'
Get-Content -Path 'variable:\MyString' |
ForEach {([regex]::Matches($MyString,$MyRegExMatch).Value)}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.