繁体   English   中英

在选择字符串中指定多个模式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM