0

我正在尝试创建一个脚本,该脚本将从服务器目录中的多个安装位置找到最新的 build_info 文件,从每个文件中选择“版本:”文本,然后比较它们是否都相同(是我们希望的),或者某些安装位置有不同的版本。作为奖励,让每个路径的安装版本都有自己的变量也很好,这样如果我必须输出任何差异,我可以说出哪些特定路径有哪些版本。例如,如果在 Path1、Path2 和 Path3 中安装了某些东西,我希望能够说“所有路径都在 3.5 版上”或“Path1 是 1.2 版,Path2 是 3.5 版,Path3 是 4.8 版”。

这是我正在尝试做的更简洁的列表:

  1. 循环浏览目录中的文件夹。
  2. 对于每个文件夹,按创建日期降序对该路径中具有特定名称的 txt 文件进行排序,然后选择最新的。
  3. 一旦它拥有来自每个路径的最新文件,从每个路径中选择字符串一个特定的短语。具体来说,“版本:”。
  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;
4

2 回答 2

1

您可以使用 Sort-Object 和 Select-Object 来确定最近的文件。这是一个函数,您可以将文件集合提供给它,它将返回最新的文件:

function Get-MostRecentFile{
    param(
        $fileList
    )
    $mostRecent = $fileList | Sort-Object LastWriteTime | Select-Object -Last 1
    $mostRecent
}
于 2018-04-03T14:46:50.997 回答
0

这是一种可能的解决方案:

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 
                        }
    }

这将生成一个对象集合,树中的每个目录都有一个对象集合,其中包含目录名称、最新版本和我们在其中找到版本号的文件的属性。您可以将这些通过管道传递给进一步的 cmdlet 以进行过滤等。

于 2018-04-03T17:33:26.743 回答