2014-12-02 64 views
0

我使用下面的腳本來搜索文件夾內的信用卡號碼包含許多子文件夾:PowerShell腳本搜索信用卡號碼的文件夾中

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

@Matt不,這是一個正則表達式。我想他是用它來過濾掉目錄或零長度的文件。 – 2014-12-02 15:06:14

+0

@BaconBits我看到了我現在錯過的/ r。您需要循環訪問每個文件夾,並可能使用布爾值構建退出策略 – Matt 2014-12-02 15:08:40

回答

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" 

它會繼續通過您指定的頂級目錄的子目錄中去。每當它到達一個沒有子目錄的目錄,或者它已經通過當前目錄的所有子目錄時,它將開始查看匹配正則表達式的文件,但是當找到第一個匹配時,將退出該函數。

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

所以你真正想要的是每個文件夾中的第一個文件已在信用卡號內容。

打破它分爲兩個部分。遞歸獲取所有文件夾的列表。然後,對於每個文件夾,以非遞歸方式獲取文件列表。搜索每個文件,直到找到匹配的文件。

我看不出有什麼簡單的方法單獨管道做到這一點。這意味着更傳統的編程技術。

這需要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 ($Result -ne $null) { 
      $Found = $true; 
      Write-Output $SearchResult; 
     } 
    } 
} 
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 
     } 
    } 
}