我正在尝试递归获取文件夹的子项。但是该文件夹包含噪音文件和文件夹(实际上,这是一个 Visual Studio 项目文件夹)。
这是我所拥有的:
$root = Get-Item C:\Projects\MyProject
$allItems = Get-ChildItem $root -Recurse -exclude "**\pkgobj\*"
但是,$allItems
仍然包含与路径匹配的文件和文件夹。
我做错什么了?
更准确地说,我想要获取文件夹和文件,但不想获取指定的文件夹及其任何后代。
我也尝试过:
foreach($item in $allItems){
if($item.FullName -notmatch "pkgobj") {
Write-Host -ForegroundColor Green $item.FullName.Replace($root,'')
}
}
但没有再成功
答案1
我花了一点时间才理解这个问题。这是一个棘手的问题。
-exclude
仅适用于项目的基本名称(即myfile.txt
),而不是您想要的全名
(即C:\pkgobj\myfile.txt
)。因此您不能使用排除这里。
但有一个解决方法,使用Fullname
和-notlike
$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"}
答案2
出于性能原因,您希望尽可能避免使用 where 语句。为了简化先前的答案。
Get-childitem -path c:\windows -exclude 'temp' | get-childitem -recurse