用于验证/比较两个服务器的文件夹和文件的PowerShell脚本

时间:2016-05-31 05:55:22

标签: powershell

我正在尝试获取文件夹中的文件数和文件夹数以及总大小。在某种程度上,我已经实现了这个目标,但是当我尝试检查数百万个文件夹/文件时,它们的大小可能在1 TB左右,但它的卡住可能会陷入无限的困境。

另外,我想比较两个位置大小和文件/文件夹的数量,并将输出作为bollen值。 - true如果大小和数字匹配,false如果不匹配。

脚本是我试过的。有人可以帮我解决这个问题。

$hostnames = Get-Content C:\server.txt
$directory = "D$\logs"

foreach ($hostname in $hostnames){

    $Folderitems = (Get-ChildItem -Path "\\$hostname\$directory" -Directory -Recurse -Force).Count  
    $FileItems = Get-ChildItem -path "\\$hostname\$directory" -recurse
    $Measurement = $FileItems | Measure-Object -property length -sum
    $colitems = $FileItems | measure-Object -property length -sum
    "$hostname,$directory;{0:N2}" -f ($colitems.sum / 1024MB) + "GB;" + $Measurement.count + " files;" + $items +"Folders;" 
}

1 个答案:

答案 0 :(得分:0)

性能改进只会调用Get-ChildItem cmdlet一次并使用它来使用Where-Object cmdlet过滤文件夹:

$FileItems = Get-ChildItem -path "\\$hostname\$directory" -recurse
$Folderitems = $FileItems | Where-Object PsIsContainer

您还要计算两次长度,删除其中一个:

$Measurement = $FileItems | Measure-Object -property length -sum
$colitems = $FileItems | measure-Object -property length -sum
  

另外我想比较两个位置的大小和数量   文件/文件夹,并以bollen值的形式输出。

您要比较哪两个地点?您正在迭代主机名列表,并且不存储任何值...

编辑您的评论:

  

关于比较部分,我想比较它的大小和数量   从server1到server2的文件,用于位置d $ \ website。它就像   同样我们右键单击文件夹并查看文件和大小。

目前,您正在检索D$\logs的项目,而不是D$\website您可能需要更改此内容?!要比较结果,您必须先存储它们。我建议使用array PSCustomObjects。结构看起来像这样(样本输出):

Server           Sum Count
------           --- -----
YourServer1 88575206   386
YourServer2 88575206   386

这里是剧本:

foreach ($hostname in $hostnames){

    $FileItems = Get-ChildItem -path "\\$hostname\$directory" -recurse

    $Folderitems = $FileItems | Where-Object PsIsContainer
    $Measurement = $FileItems | Measure-Object -property length -sum

    $serverFileMeasurements += [PSCustomObject]@{
        Server = $hostname
        Sum = $Measurement.Sum
        Count = $Measurement.Count
    }
}

# assuming there are only two servers:
if ($serverFileMeasurements[0].Count -eq $serverFileMeasurements[1].Count -and 
    $serverFileMeasurements[0].Sum -eq $serverFileMeasurements[1].Sum)
{
    Write-Host $true
}
else
{
    Write-Host $false
}