找到这个主题:Exclude multiple subfolders while using Powershell's method Get-Childitem 并设法使用给定的参数对其进行测试,它似乎正常运行,因此我非常确定我使用的语法是正确的。但是,很明显,根据我的参数,它并不适合我。
在这里将所有内容都删除为两条相关的行:
$ExcludeDirs = @('$RECYCLE.BIN','Temporary ASP.NET Files','Temporary Internet Files','Temp','System Volume Information','RECYCLER')
gci -Path T:\ -Force -Recurse | Where {!($ExcludeDirs -match [regex]::escape($_.Fullname))}
这是输出中的前几行:
PS C:\Users\Angelo Mileto> $ExcludeDirs = @('$RECYCLE.BIN','Temporary ASP.NET Files','Temporary Internet Files','Temp','System Volume Information','RECYCLER')
gci -Path T:\ -Force -Recurse | Where {!($ExcludeDirs -match [regex]::escape($_.Fullname))}
Directory: T:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--hs 12/22/2013 4:57 PM $RECYCLE.BIN
d---- 07/15/2012 2:19 PM DropBox.Dir
d---- 12/09/2010 7:18 PM ftproot
d---- 07/27/2012 5:52 PM GNS3
d---- 08/16/2014 3:44 PM New folder
d---- 05/10/2012 7:33 AM ProgramData
d--hs 04/13/2012 7:48 PM RECYCLER
d---- 03/10/2010 6:25 PM SEP
d--hs 12/28/2012 5:42 PM System Volume Information
d---- 08/08/2012 7:33 PM Temp
d---s 03/12/2014 4:57 PM Temporary Internet Files
d---- 09/24/2013 5:24 PM VMWare_8.Dir
d---- 06/07/2008 7:06 AM WINDOWS
-a--- 08/18/2013 12:48 AM 0 Cleanup_T
-a--- 12/15/2012 8:01 AM 68 Cleanup_T.txt
-a--- 03/14/2014 7:28 PM 24761548 Data_Hash1.txt
-a--- 03/14/2014 8:12 PM 24761548 Data_Hash2.txt
-a--- 09/24/2013 5:21 PM 3923 NewFolder.reg
-a-hs 09/14/2014 2:02 AM 1717879193 pagefile.sys
6
-a--- 09/24/2013 5:17 PM 335484316 Registry_BU.reg
-a--- 08/17/2014 11:58 AM 1020 TempHash.txt
-a--- 09/13/2014 6:29 PM 57466 VM_Hash1.txt
-a--- 08/17/2014 12:49 PM 0 VM_Hash2.txt
Directory: T:\$RECYCLE.BIN
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--hs 04/28/2012 7:57 AM S-1-5-18
d--hs 04/15/2012 12:01 PM S-1-5-21-2447911456-218057785-4074464323-1000
d--hs 05/07/2012 5:31 PM S-1-5-21-3003357132-2481200545-788173088-1000
d--hs 09/16/2014 7:31 PM S-1-5-21-3108701050-3840048422-4210986610-1000
d--hs 12/22/2013 4:57 PM S-1-5-21-3108701050-3840048422-4210986610-1013
d--hs 08/12/2012 7:00 AM S-1-5-21-3201584925-4004853213-4110546137-1000
d--hs 04/16/2012 8:10 PM S-1-5-21-3464201764-390295408-3614804669-1000
d--hs 12/15/2012 7:43 PM S-1-5-21-3742232801-2663128855-664334430-1000
Directory: T:\$RECYCLE.BIN\S-1-5-18
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a-hs 04/28/2012 7:57 AM 129 desktop.ini
Directory: T:\$RECYCLE.BIN\S-1-5-21-2447911456-218057785-4074464323-1000
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a-hs 04/15/2012 12:01 PM 129 desktop.ini
Directory: T:\$RECYCLE.BIN\S-1-5-21-3003357132-2481200545-788173088-1000
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a-hs 05/07/2012 5:31 PM 129 desktop.ini
Directory: T:\$RECYCLE.BIN\S-1-5-21-3108701050-3840048422-4210986610-1000
显然,你可以看到我的ExcludeDirs变量中的第一项是$ RECYCLE.BIN - 是的,意识到它对于这个函数不区分大小写,但希望尽可能保持精确。
所以问题是,为什么它不起作用或者我对使用-match缺少什么?
总体目标是最终得到给定驱动器/目录树上的所有文件的列表,然后我可以对其进行操作但是我想省略一直在更改的内容(即临时目录等)获取系统和隐藏文件的列表。
谢谢!
答案 0 :(得分:1)
所以这就是我要做的事情。你有你的数组,-match实际上是为字符串而不是数组而设计的,所以让我们将你的数组转换为正则表达式匹配字符串。我们将通过[RegEx]::Escape()
运行每个项目,并使用|加入它们并将它全部包装在括号中:
$RegExExclude = "((?<=\\)$(($ExcludeDirs |ForEach{[regex]::escape($_)}) -join "(?=\\|$)|(?<=\\)")(?=\\|$))"
现在它以字符串形式出现:
(\$RECYCLE\.BIN|Temporary\ ASP\.NET\ Files|Temporary\ Internet\ Files|Temp|System\ Volume\ Information|RECYCLER)
然后我们就像这样对你的GCI工作:
$ExcludeDirs = @('$RECYCLE.BIN','Temporary ASP.NET Files','Temporary Internet Files','Temp','System Volume Information','RECYCLER')
$RegExExclude = "((?<=\\)$(($ExcludeDirs |ForEach{[regex]::escape($_)}) -join "(?=\\|$)|(?<=\\)")(?=\\|$))"
gci -Path T:\ -Force -Recurse | Where {!($_.FullName -match $RegExExclude)}
修改:按照briantist的建议更新,这是一个很好的建议。