【问题标题】:Powershell - Sorting and selecting files in foreach loopPowershell - 在 foreach 循环中排序和选择文件
【发布时间】:2018-04-03 14:40:30
【问题描述】:

我正在尝试创建一个脚本,该脚本将从服务器目录中的多个安装位置找到最新的 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;

【问题讨论】:

    标签: powershell loops sorting foreach select-string


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我忘了我可以使用排序和选择部分的功能。我只是想确保我了解它所做的一切,因为我从未在 PS 中使用过具有参数的函数。 $fileList 是我要传递的目录吗?然后一旦函数中的所有工作完成,我会将 $mostRecent 传递给 Select-String 部分?
    • $fileList 是文件列表。所以你可以这样称呼它:$mostRecentTXTFile = Get-MostRecentFile (ls C:\Some\Path\*.txt)
    【解决方案2】:

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

    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 以进行过滤等.

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 2018-09-19
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多