我使用以下脚本在包含许多子文件夹的文件夹中搜索信用卡号:
Get-ChildItem -rec | ?{ findstr.exe /mprc:. $_.FullName }
| select-string "[456][0-9]{15}","[456][0-9]{3}[-| ][0-9]{4} [-| ][0-9]{4}[-| ][0-9]{4}"
但是,这将返回在每个文件夹/子文件夹中找到的所有实例。
如何修改脚本以跳过找到的第一个实例上的当前文件夹?这意味着如果找到信用卡号,它将停止处理当前文件夹并移动到下一个文件夹。
感谢您的回答和帮助。
提前致谢,
答案 0 :(得分:1)
你可以使用这个递归函数:
function cards ($dir)
Get-ChildItem -Directory $dir | % { cards($_.FullName) }
Get-ChildItem -File $dir\* | % {
if ( Select-String $_.FullName "[456][0-9]{15}","[456][0-9]{3}[-| ][0-9]{4} [-| ][0-9]{4}[-| ][0-9]{4}" ) {
write-host "card found in $dir"
return
}
}
}
cards "C:\path\to\base\dir"
它将继续浏览您指定的顶级目录的子目录。每当它到达没有子目录的目录,或者它已经通过当前目录的所有子目录时,它就会开始查看匹配的正则表达式的文件,但是当找到第一个匹配时,它会退出函数
答案 1 :(得分:1)
所以你真正想要的是每个文件夹中第一个在内容中都有信用卡号的文件。
将其分为两部分。以递归方式获取所有文件夹的列表。然后,对于每个文件夹,以非递归方式获取文件列表。搜索每个文件,直到找到匹配的文件。
我没有看到任何简单的方法来单独使用管道。这意味着更传统的编程技术。
这需要PowerShell 3.0。我已经删除了?{ findstr.exe /mprc:. $_.FullName }
,因为我只能看到它消除文件夹(和零长度文件),这已经处理了。
Get-ChildItem -Directory -Recurse | ForEach-Object {
$Found = $false;
$i = 0;
$Files = $_ | Get-ChildItem -File | Sort-Object -Property Name;
for ($i = 0; ($Files[$i] -ne $null) -and ($Found -eq $false); $i++) {
$SearchResult = $Files[$i] | Select-String "[456][0-9]{15}","[456][0-9]{3}[-| ][0-9]{4} [-| ][0-9]{4}[-| ][0-9]{4}";
if ($SearchResult) {
$Found = $true;
Write-Output $SearchResult;
}
}
}
答案 2 :(得分:0)
没有时间对它进行全面测试,但我想到了这样的事情:
$Location = 'H:\'
$Dirs = Get-ChildItem $Location -Directory -Recurse
$Regex1 = "[456][0-9]{3}[-| ][0-9]{4} [-| ][0-9]{4}[-| ][0-9]{4}"
$Regex2 = "[456][0-9]{15}"
Foreach ($d in $Dirs) {
$Files = Get-ChildItem $d.FullName -File
foreach ($f in $Files) {
if (($f.Name -match $Regex1) -or ($f.Name -match $Regex2)) {
Write-Host 'Match found'
Return
}
}
}
答案 3 :(得分:0)
这是另一个,为什么不,越多越好。
我假设您的正则表达式是正确的。
在第二个循环中使用break
将跳过在剩余文件中查找信用卡(如果找到)并继续到下一个文件夹。
$path = '<your path here>'
$folders = Get-ChildItem $path -Directory -rec
foreach ($folder in $folders)
{
$items = Get-ChildItem $folder.fullname -File
foreach ($i in $items)
{
if (($found = $i.FullName| select-string "[456][0-9]{15}","[456][0-9]{3}[-| ][0-9]{4} [-| ][0-9]{4}[-| ][0-9]{4}") -ne $null)
{
break
}
}
}