几个小时我一直在努力让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'例如?
答案 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不区分大小写,因此您不需要多次添加相同的扩展名。