PowerShell, более эффективный способ поиска дубликатов папок - PullRequest
2 голосов
/ 02 марта 2020

Я написал небольшую функцию для сканирования каждой папки в $PSModulePath, чтобы увидеть, существуют ли дубликаты имен папок в различных путях (как я обнаружил, эта проблема встречается довольно часто в моей среде PowerShell!). Я использую простую логику c, и мне было интересно, есть ли у некоторых гуру PowerShell более компактные / более быстрые / более эффективные способы достижения такой степени развертки (я часто обнаруживаю, что у тех, кто лучше в PowerShell, есть что-то вроде двухстрочных решений) это занимает у меня 15 строк! :-))?

Я просто беру путь в $PSModulePath и создаю там массив имен подпапок, затем просматриваю подпапки other путей в $PSModulePath и сравнение их по одному с массивом, который я создал для первого пути, а затем повторение для других путей.

function Find-ModuleDuplicates {
    $hits = ""
    $ModPaths = $env:PSModulePath -Split ";" -replace "\\+$", "" | sort
    foreach ($i in $ModPaths) {
        foreach ($j in $ModPaths) {
            if ($j -notlike "*$i*") {
                $arr_i = (gci $i -Dir).Name
                $arr_j = (gci $j -Dir).Name
                foreach ($x in $arr_j) {
                    if ($arr_i -contains $x) {
                        $hits += "Module '$x' in '$i' has a duplicate`n" 
                    }
                }
            }
        }
    }
    if ($hits -ne "") { echo "" ; echo $hits }
    else { "`nNo duplicate Module folders were found`n" }
}

1 Ответ

3 голосов
/ 02 марта 2020

Ниже приведено решение с использованием Group-Object.

$env:PSModulePath.Split(";") | gci -Directory | group Name |
where Count -gt 1 | select Count,Name,@{ n = "ModulePath"; e = { $_.Group.Parent.FullName } }
...