Powershell - сортировка и выбор файлов в цикле foreach

Я пытаюсь создать сценарий, который будет искать самые последние файлы build_info из нескольких мест установки в каталоге сервера, выбирать текст "версия: " из каждого файла и сравнивать их, чтобы увидеть, все ли они одинаковые (что это то, на что мы надеемся), или если определенные места установки имеют разные версии. В качестве бонуса было бы также неплохо, чтобы у установочной версии каждого пути была своя собственная переменная, чтобы, если мне нужно было выводить какие-либо различия, я мог сказать, какие конкретные пути имеют какие версии. Например, если что-то установлено в Path1, Path2 и Path3, я хочу сказать, что "все пути в версии 3.5" или "Path1 - версия 1.2, Path2 - версия 3.5, Path3 - версия 4.8".

Вот аккуратный список того, что я пытаюсь сделать:

  1. Перебирайте папки в каталоге.
  2. Для каждой папки отсортируйте текстовые файлы с определенным именем в этом пути по дате создания по убыванию и выберите самые последние.
  3. Как только у него появятся самые последние файлы из каждого пути, выберите-String конкретную фразу из каждого из них. В частности, "версия: ".
  4. Сравните версию каждого пути и посмотрите, все ли они одинаковые или есть различия, а затем выведите результат.

Это то, что я смог написать до сих пор:

$Directory = dir D:\Directory\Path* | ?{$_.PSISContainer};
$Version = @();

foreach ($d in $Directory) {
    $Version = (Select-String -Path D:\Directory\Path*\build_info_v12.txt -Pattern "Version: " | Select-Object -ExpandProperty Line) -replace "Version: ";
}

if (@($Version | Select -Unique).Count -eq 1) {
    Write-Host 'The middle tiers are all on version' ($Version | Select -Unique);
}
else {
    Write-Host 'One or more middle tiers has a different version.';
}

Мне пришлось жестко писать код в самых последних файлах build_info, потому что я не уверен, как включить в это аспект сортировки. Я также не уверен, как эффективно присваивать результат каждого пути переменной и выводить их, если есть различия. Это то, с чем я возился, что касается сортировки, но я не знаю, как это включить, и я даже не уверен, что это правильный подход:

$Recent = Get-ChildItem -Path D:\Directory\Path*\build_info*.txt | Sort-Object CreationTime -Descending | Select-Object -Index 0;

2 ответа

Вы можете использовать Sort-Object и Select-Object, чтобы определить самый последний файл. Вот функция, которой вы можете передать коллекцию файлов, и она вернет самую последнюю:

function Get-MostRecentFile{
    param(
        $fileList
    )
    $mostRecent = $fileList | Sort-Object LastWriteTime | Select-Object -Last 1
    $mostRecent
}

Вот одно из возможных решений:

Get-ChildItem "D:\Directory\Path" -Include "build_info*.txt" -File -Recurse |
    Group-Object -Property DirectoryName |
        ForEach-Object {
            $_.Group |
                Sort-Object LastWriteTime -Descending |
                    Select-Object -First 1 |
                        ForEach-Object {
                            New-Object -TypeName PsCustomObject |
                                Add-Member -MemberType NoteProperty -Name Directory -Value $_.DirectoryName -PassThru |
                                Add-Member -MemberType NoteProperty -Name FileName -Value $_.Name -PassThru |
                                Add-Member -MemberType NoteProperty -Name MaxVersion -Value ((Select-String -Path $_.FullName -Pattern "Version: ").Line.Replace("Version: ","")) -PassThru 
                        }
    }

Это создаст коллекцию объектов, по одному для каждого каталога в дереве, со свойствами для имени каталога, самой последней версии и файла, в котором мы нашли номер версии. Вы можете передать их следующим командлетам для фильтрации и т. Д.

Другие вопросы по тегам