比较 Powershell 脚本中断前后多个子目录的大小

Compare size of multiple subdirectory before and after a break in a Powershell script

我是Powershell的初学者,还请原谅我的英语不是最好的。

我有一个包含多个子目录的目录,如下所示

Directory

我的目标是在脚本 运行 时更新目标目录。所以我做了这个脚本

$path = "C:\Users\s611284\Desktop\archive"

#Check that the directories have the correct name and calculate their size

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach {
     
  $Size = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

  $FolderName = $_.BaseName -match '1B(\d{6})_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{6})' -or $_.BaseName -match '1B(\d{6})_SML 10_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{5})' 

  $Folder = $_.BaseName

  if ($FolderName -eq "true") {
    write-host(" name $Folder is correct, $Size Kb")
  }
  else {
    write-host( "name $Folder is incorrect")
  }
}  

#Break 

Start-Sleep -Seconds 30

write-host( "end of break")
 

#directory size calculation after the break

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach {
     
  $Size1 = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

  $FolderName1 = $_.BaseName -match '1B(\d{6})_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{6})' -or $_.BaseName -match '1B(\d{6})_SML 10_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{5})' 

  $Folder1 = $_.BaseName

  if ($FolderName1 -eq "true") {
    write-host("name $Folder1 is correct, $Size1 Kb")
  }
  else {
    write-host( "name $Folder1 is incorrect")
  }
}

所有这些都运行良好

所以现在我想比较一下break前后的子目录大小,知道哪些已经更新了

我试过了

if ( $FolderSize -eq $FolderSize1 )
{
    Write-Output $True
}

Else
{ 
  Write-Output $False
}

在我的第二个区块的末尾,但它不起作用..

我也试过比较对象,但我认为这个命令对我的情况没有帮助

我希望你们能理解我的post并帮助我 谢谢!

如果我没理解错的话,您要过滤那些 30 秒后大小发生变化的文件夹,如果是这样的话,您可以使用 function so that you don't need to repeat your code. You can make your function return a hash table 其中键是文件夹的绝对路径,值是它们的计算大小,一旦你得到两个结果(30 秒前和 30 秒后),你可以 运行 比较两个哈希表输出一个新对象文件夹的绝对路径前大小后大小仅适用于计算大小[=14]的文件夹=]已经改变.

function GetFolderSize {
    [cmdletbinding()]
    param($path)
    
    $map = @{}
    Get-ChildItem $path -Directory -Force | ForEach-Object {
        $Size = (Get-ChildItem $_.Fullname -Recurse | Measure-Object -Property Length -Sum).Sum / 1Kb
        $FolderName = $_.BaseName -match '1B(\d{6})_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{6})' -or $_.BaseName -match '1B(\d{6})_SML 10_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{5})'
        if ($FolderName) {
            $map[$_.FullName] = $size
        }
    }
    if($map) { $map }
}

$path = "C:\Users\s611284\Desktop\archive"

$before = GetFolderSize $path -ErrorAction SilentlyContinue
Start-Sleep -Seconds 30
$after = GetFolderSize $path -ErrorAction SilentlyContinue

foreach($key in $after.PSBase.Keys) {
    if($before[$key] -ne $after[$key]) {
        # this is a folder with a different size than before
        [PSCustomObject]@{
            FullName   = $key
            SizeBefore = $before[$key]
            SizeAfter  = $after[$key]
        }
    }
}

不是为了摆脱 Santiago's helpful ,而是为了提供替代解决方案,这是我的看法:

$path  =  "C:\Users\s611284\Desktop\archive"
$count = 0 
$hashMap = @{}
While ($count -lt 2) {
    Get-ChildItem -Path $path -Directory | 
        ForEach-Object -Begin {
            $count++
            $toMatch = "1B(\d{6})_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{6})|1B(\d{6})_SML 10_LEAP 1A version aout2021_(\d{4})-(\d{2})-(\d{2})T(\d{2})h(\d{2})m(\d{2})s_S(\d{5})" 
        } -Process {
            $folderMatch = $_.BaseName -match $toMatch
                if ($folderMatch) {
                    $size = (Get-ChildItem -Path $_.FullName -Recurse -EA 0 | Measure-Object -Property "Length" -Sum).Sum / 1kb
                    if (-not$hashMap.ContainsKey($_.BaseName))  {
                        $hashMap.Add($_.BaseName,$size)
                    }
                    if ($count -ge 2) {
                        if ($hashMap[$_.BaseName] -ne $size) {
                            $_.BaseName + " " + "is a different size" 
                        }
                    }
                }
        } -End {
            if ($count -ne 2) {
                Start-Sleep -Seconds 30
            }
        }
}

就我个人而言,我讨厌 re-use 代码,并且觉得如果您发现自己在重复代码,总能有所作为 (copy/paste) .

我的问题是:

  1. 这些文件夹的名字是不是很独特
  2. 你能不能用它代替 Wild Card Expression
    • 即:$_.BaseName -like '*1A version aout2021*'
    • 一切以“清洁度”代码为名。哈哈