PowerShell - 有效地确定文件夹层次结构中某些文件的存在

时间:2014-10-09 03:42:59

标签: sorting powershell

我希望能够减少在客户端站点发生密码锁定爆发后需要恢复的文件夹数量,并开始考虑使用PowerShell作为执行此操作的好方法。我需要做的是恢复一个文件夹,如果它里面有任何扩展名为.encrypted的文件。

我可以运行以下

get-childitem C:\ -recurse -filter “*.encrypted” | %{$_.DirectoryName} | Get-Unique

并获取其中包含.encrypted文件的所有文件夹的列表,但我想要做的是在列表中缩小,例如,如果我们有以下文件列表并假设*表示该文件夹包含加密文件。

C:\ Folder1中

C:\ Folder1中\ FOLDER2 \ Folder4 *

C:\ Folder1中\ FOLDER2 *

C:\ Folder1中\ Folder3 \ Folder5 *

C:Folder1中\ Folder3 \ Folder6 \

而不是返回

C:\ Folder1中\ FOLDER2 \ Folder4 *

C:\ Folder1中\ FOLDER2 *

C:\ Folder1中\ Folder3 \ Folder5 *

我希望它能够返回,因为这将是最佳的恢复选项。

C:\ Folder1中\ FOLDER2 *

C:\ Folder1中\ Folder3 \ Folder5 *

我知道这是一个相当复杂的问题,所以我不是要求任何人为我解决它只是在正确方向上的一些指针会很棒,因为我的大脑现在正在炒,我需要相当快地写出来。

2 个答案:

答案 0 :(得分:2)

这是一个非常有效的简单方法:

PS C:\> dir -ad -rec | where { test-path (join-path $_.FullName *.encrypted) }
  • dirget-childitem
  • 的别名
  • wherewhere-object
  • 的别名
  • -ad仅表示返回目录
  • -rec表示递归
  • 如果路径存在,则
  • test-path返回$true(是的,它处理通配符)

S,我们通过所有文件夹递归转发管道中的文件夹对象。我们获取该文件夹的全名,并将*.encrypted附加到其中。如果test-path为此路径返回$ true,我们会将文件夹转发到管道中。该文件夹最终出现在控制台输出中。

现在,如果你想获得一点点发烧友,这里的单行内容比报告文件夹和加密文件的数量要多,而且会计入以机器命名的csv文件:

dir -ad -rec | ? { test-path (join-path $_.FullName *.txt) } | % {
    [pscustomobject]@{"Path"=$_.fullname;"Count"=(dir (join-path $_ *.txt)).count}} |`
    Export-Csv "c:\temp\$(hostname).csv" -NoTypeInformation

?%分别是where-objectforeach-object的别名

通过稍微努力,您可以使用整个公司的扇出扫描,假设在每台目标计算机上启用了PowerShell远程处理,并让它从所有计算机返回所有结果。

祝你好运!

答案 1 :(得分:0)

这对于评论来说太过分了,但我不知道这将是一个很好的答案,只是一种完成它的一种hackish方式......

我唯一能想到的就是获取你的文件夹列表,然后开始将它们全部相互匹配,当你得到两个至少部分匹配时删除较长的文件夹。

$FullList = GCI C:\*.encrypted | Select -Expand DirectoryName -Unique | Sort -Property Length
$ToRemove = @()
foreach($Folder in $FullList){$ToRemove+=$FullList| Where{$_ -ne $Folder -and ($_ -match [regex]::Escape($Folder))}}
$FinalList = $FullList | Where{$ToRemove -notcontains $_}

虽然情况会变慢,但必须有更好的方法。我还没有想过更好的方法。

不要误解我的意思,这会有效,而且肯定比手工操作更快,但我确信必须有更好的方法来做到这一点。