我有一个脚本,它将递归搜索网络路径并提取文件名。但是,前5个文件夹需要从搜索中排除,因为它已被弃用,但尚未删除它们(我无权删除文件夹)。
我需要做的是排除一些名为- BOOT MEDIA
,1_Do_not_use
,1_lync
以及其他文件夹的文件夹。
如何递归搜索目录并从搜索中排除正确的文件夹?
到目前为止我所拥有的:
param(
[string]$gather = "PACKAGE"
)
function say($info){ Write-Host $info }
function searchDir($path = "<removed for security>")
{
foreach ($item in Get-ChildItem $path)
{
$package = Test-Path $item.FullName -PathType Container
if ($package)
{
$item
searchDir $item.FullName
}
else
{
$item
}
}
}
目录图片:
图像显示从答案给出的输出:
答案 0 :(得分:1)
排除可能以递归方式存在的弃用文件夹,PS2.0 +:
function searchDir($path = "<removed for security>")
{
$deprecated = '- BOOT MEDIA', '1_Do_not_use', '1_lync'
Get-ChildItem $path | ForEach {
if ($_ -is [IO.FileInfo]) {
$_
} elseif ($deprecated -notcontains $_.Name) {
$_
searchDir $_.FullName
}
}
}
更快的.NET4 +版本只输出完整的文件名,而不是对象
这些目录最后有\
,因此很容易辨别。
function searchDir($path = "<removed for security>")
{
$deprecated = '- BOOT MEDIA', '1_Do_not_use', '1_lync', 'default'
[IO.Directory]::EnumerateFiles($path)
[IO.Directory]::EnumerateDirectories($path) | ForEach {
if ($deprecated -notcontains $_.Name) {
"$_\"
searchDir $_
}
}
}
另一种方法是用一个Get-ChildItem枚举所有内容,然后从结果中过滤掉已弃用的文件夹,但由于网络访问速度慢,我避免了不必要的枚举,转而支持自递归函数也被OP使用。
重要提示。
现在该功能是管道友好的,因此可以通过管道输出立即来处理其结果。
OP的函数停止了被调用者的进一步执行,直到获取所有文件,因为foreach
语句在枚举之前累积整个数组。使用慢速网络或大型目录树,这可能需要几分钟。