在递归文件搜索期间排除文件夹

时间:2014-10-14 14:27:47

标签: powershell powershell-v3.0 powershell-ise

几个小时我一直在努力让PowerShell做以下事情:

使用基本目录 C:\ Users 并递归遍历除每个用户目录的 AppData 文件夹之外的所有文件夹,并排除名为的用户:

$exclude = @('Administrator', 'All Users', 'Default', 'Default User', 'Public', 'TEMP')

然后输出应该列出所有具有特定扩展名的文件。

更新

如何将这些附加语句添加到输出中?

 Get-Childitem $Path -Include $extensions -Recurse -Force  -ErrorAction SilentlyContinue |
  Select Name,Directory,@{Name="Owner";Expression={(Get-ACL $_.Fullname).Owner}},CreationTime,LastAccessTime,  Length

2。更新

设置模式以便与网络的远程主机匹配的正确方法是什么?

$exclude_pattern = "\\hostname\\c$\\Users\\(" + ($exclude -join '|') + ")";

如果我用我的电脑名称替换主机名,它就不匹配。与本地模式相比,我不知道线路的错误位置:

C:\\Users\\(Administrator|All Users|Default|Default User|Public|TEMP|Saargummi|dvop|leasingadmin|cenit|cadop|[^\\]+\\AppData)
\\hostname\\c$\\Users\\(Administrator|All Users|Default|Default User|Public|TEMP|Saargummi|dvop|leasingadmin|cenit|cadop|[^\\]+\\AppData) 

第3。更新

是否有一种智能方法可以包含以大写字母书写的扩展名? 或者我是否需要撰写' .wav',' .WAV'例如?

1 个答案:

答案 0 :(得分:2)

$exclude = @("Administrator",
             "All Users",
             "Default",
             "Default User",
             "Public",
             "TEMP",
             "[^\\]+\\AppData")

$extensions = "*.ini" # replace this with your extension
$hostname = "hostname" # replace this with your hostname

$exclude_pattern = "\\\\{0}\\C[$]\\Users\\({1})" `
    -f $hostname, ($exclude -join '|')
$path = "\\{0}\C$\Users" -f $hostname

Get-ChildItem -Path $path -Force -Recurse -Include $extensions `
    -ErrorAction "SilentlyContinue" `
    | Where-Object { $_.PSIsContainer -eq $false } `
    | Where-Object { $_.FullName -notmatch $exclude_pattern } `
    | ForEach-Object {
        $_ | Select-Object -Property @(
            "Name",
            "Directory",
            @{Label="Owner";Expression={(Get-ACL $_.Fullname).Owner}},                      
            "CreationTime",
            "LastAccessTime",
            "Length"
        )
    }

[更新1]:根据您更新的问题添加了输出格式。通过在一个正则表达式模式中合并所有排除来缩短。

[更新2]:已更改为UNC路径。请注意,所有者可能会显示为SID。查看here以获取用户名翻译的SID。

[Update 3]:默认情况下,PowerShell不区分大小写,因此您不需要多次添加相同的扩展名。