Powershell - сортировка и выбор файлов в цикле foreach
Я пытаюсь создать сценарий, который будет искать самые последние файлы build_info из нескольких мест установки в каталоге сервера, выбирать текст "версия: " из каждого файла и сравнивать их, чтобы увидеть, все ли они одинаковые (что это то, на что мы надеемся), или если определенные места установки имеют разные версии. В качестве бонуса было бы также неплохо, чтобы у установочной версии каждого пути была своя собственная переменная, чтобы, если мне нужно было выводить какие-либо различия, я мог сказать, какие конкретные пути имеют какие версии. Например, если что-то установлено в Path1, Path2 и Path3, я хочу сказать, что "все пути в версии 3.5" или "Path1 - версия 1.2, Path2 - версия 3.5, Path3 - версия 4.8".
Вот аккуратный список того, что я пытаюсь сделать:
- Перебирайте папки в каталоге.
- Для каждой папки отсортируйте текстовые файлы с определенным именем в этом пути по дате создания по убыванию и выберите самые последние.
- Как только у него появятся самые последние файлы из каждого пути, выберите-String конкретную фразу из каждого из них. В частности, "версия: ".
- Сравните версию каждого пути и посмотрите, все ли они одинаковые или есть различия, а затем выведите результат.
Это то, что я смог написать до сих пор:
$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
}
}
Это создаст коллекцию объектов, по одному для каждого каталога в дереве, со свойствами для имени каталога, самой последней версии и файла, в котором мы нашли номер версии. Вы можете передать их следующим командлетам для фильтрации и т. Д.