首先我要说的是,我已查看Unable to exclude directory using Get-ChildItem -Exclude parameter in Powershell和How can I exclude multiple folders using Get-ChildItem -exclude?。这些都没有解决我的问题的答案。
我需要递归搜索具有特定扩展名的文件的目录。为简单起见,我们只需要找*.txt
即可。通常,这个命令就足够了:
Get-ChildItem -Path 'C:\mysearchdir\' -Filter '*.txt' -Recurse
但我有一个重大问题。在node_modules
内部有一个C:\mysearchdir\
目录,NPM创建了非常深的嵌套目录。 (它的详细信息是NPM托管目录,这很重要,因为这意味着深度超出了我的控制范围。)这会导致以下错误:
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
我认为这个错误源于.NET IO库中的限制。
我无法轻易搜索周围的其他目录。它不在目录的顶部;它更深入,比如在C:\mysearchdir\dir1\dir2\dir3\node_modules
,并且我需要在所有这些级别搜索目录。所以只是搜索周围的其他目录会很麻烦,而且随着更多文件和目录的添加而无法维护。
我试过-Exclude
参数但没有成功。这并不令人惊讶,因为我just read -Exclude
仅在获取结果后应用-Filter
。我无法找到有关使用Get-ChildItem
的任何真实信息(如this answer中所述)。
我有什么方法可以让{{1}}工作,或者我是不是在编写自己的递归遍历?
答案 0 :(得分:5)
哦,伙计,我感到愚蠢。我遇到了和你一样的问题。我正在使用@ DarkLite1的答案,试图解析它,当我到达“-EA SilentlyContinue”部分时。
捂脸!
这就是你所需要的一切!
这对我有用,试一试:
Get-ChildItem -Path 'C:\mysearchdir\' -Filter '*.txt' -Recurse -ErrorAction SilentlyContinue
注意:这将不从搜索中排除node_modules,只需隐藏遍历长路径生成的任何错误。如果你需要完全排除它,你将需要一个更复杂的解决方案。
答案 1 :(得分:1)
也许你可以尝试这样的事情:
$Source = 'S:\Prod'
$Exclude = @('S:\Prod\Dir 1', 'S:\Prod\Dir 2')
Get-ChildItem -LiteralPath $Source -Directory -Recurse -PipelineVariable Dir -EV e -EA SilentlyContinue |
Where {($Exclude | Where {($Dir.FullName -eq "$_") -or ($Dir.FullName -like "$_\*")}).count -eq 0}