PowerShell:如何从目录指定子文件夹仅列出文件名
我懂你遇到的麻烦了——当你尝试用-Recurse搭配-Include指定文件夹名称时,PowerShell只返回了那两个文件夹本身,完全没给出里面的文件。这是因为-Include在这里默认匹配的是文件夹对象,不是我们要找的文件。下面给你几个实用的解决办法:
方法1:直接定位目标文件夹(最直观)
如果已经明确知道要找的是FolderTwo和FolderThree,直接指定它们的路径,再加-File参数只返回文件就行:
Get-ChildItem -Path "C:\MainFolder\FolderTwo", "C:\MainFolder\FolderThree" -File
要是这两个文件夹里还有嵌套的子文件夹,需要连里面的文件一起列出,就加上-Recurse:
Get-ChildItem -Path "C:\MainFolder\FolderTwo", "C:\MainFolder\FolderThree" -File -Recurse
方法2:遍历主目录后过滤文件路径
如果想从主目录开始递归遍历,再筛选出目标文件夹里的文件,可以用Where-Object来过滤文件所在的目录:
Get-ChildItem -Path "C:\MainFolder" -File -Recurse | Where-Object { $_.DirectoryName -match "FolderTwo|FolderThree" }
这里-File确保只返回文件对象,-Recurse遍历所有子目录,最后用正则匹配筛选出目录包含FolderTwo或FolderThree的文件。
方法3:修正-Include的使用方式(进阶)
你之前的写法问题在于,当路径是目录且没加通配符时,-Include会匹配目录本身。如果非要用-Include,得在路径末尾加\*,让PowerShell知道要匹配目录下的内容:
Get-ChildItem -Path "C:\MainFolder\*" -Include "FolderTwo\*", "FolderThree\*" -File -Recurse
不过这种写法不如前两种直观,一般更推荐前两种方案。
为什么原来的方法失效?
当你执行Get-ChildItem -Path C:\MainFolder -Recurse -Include "FolderTwo", "FolderThree"时,PowerShell会遍历主目录下的所有对象,-Include在这里匹配的是名称为FolderTwo/FolderThree的目录,所以只会返回这两个文件夹,而不是里面的文件。必须明确指定要获取文件,并且精准筛选它们的所在目录才行。
内容的提问来源于stack exchange,提问作者v_kumar

