如何用Get-ChildItem递归查找JPG并跳过指定父文件夹内的文件
解决Get-ChildItem仅递归子文件夹并跳过当前目录文件的问题
我懂你的需求——你要在D:\Images\$YM\$YMD\$USERNAME这个路径下,只抓取用户名文件夹子文件夹里的.jpg文件,完全忽略该文件夹根目录下的同名文件对吧?这里有两个实用的实现方式,你可以根据场景选择:
方法一:先递归再过滤路径
这种方法先一次性递归所有.jpg文件,再通过路径过滤掉根目录下的文件,写法简洁:
# 安全拼接目标路径(推荐用Join-Path避免手动拼接的路径错误) $targetPath = Join-Path -Path 'D:\Images' -ChildPath "$local:YM\$local:YMD\$env:USERNAME" # 递归查找所有.jpg,再过滤出不在根目录的文件 Get-ChildItem -Path $targetPath -Filter '*.jpg' -Recurse | Where-Object { $_.Directory.FullName -ne $targetPath }
原理很简单:$_.Directory.FullName会拿到当前文件所在的文件夹路径,只要这个路径不等于我们的目标根路径,就说明文件在子文件夹里,符合要求。
方法二:直接遍历子文件夹再递归
如果你的用户名文件夹根目录下有大量非目标文件,这种方法效率更高——先获取所有子文件夹,再在每个子文件夹里递归查找:
$targetPath = Join-Path -Path 'D:\Images' -ChildPath "$local:YM\$local:YMD\$env:USERNAME" # 先拿到目标路径下的所有子文件夹,再逐个递归找.jpg Get-ChildItem -Path $targetPath -Directory | ForEach-Object { Get-ChildItem -Path $_.FullName -Filter '*.jpg' -Recurse }
这种方式天然跳过了根目录的文件,因为我们根本没在根目录执行查找操作,直接从子文件夹开始处理。
小提示
不管用哪种方法,都推荐用Join-Path来拼接路径,它会自动处理Windows路径的分隔符问题,避免手动拼接时出现的格式错误(比如多一个斜杠或者少一个斜杠)。
内容的提问来源于stack exchange,提问作者Garrett
相关产品推荐
相关产品推荐

