比较子文件夹中的文件数

时间:2015-07-03 22:06:49

标签: powershell comparison subdirectory

我想将2个给定文件夹的子文件夹中的文件数与PowerShell脚本进行比较,但是有些东西无效。

我通过用户输入获得了2个文件夹的路径并保存了它们 在变量$where1$where2中,我还将脚本开始的位置保存到变量$a中。我更改为给定的文件夹,以获取有关子文件夹的信息到2个数组,一个辅助数组$folderArrayX,其数字如此$folderArrayX["subfolder1"]=xx是子文件夹1的子项数)和一个只是与子文件夹的名称,以便于比较。给出的第一个文件夹的代码:

cd $where1;
$folderArray1 = @();
$folderArray1Keys = @();
Get-Childitem | Select-Object | ForEach-Object {
  if ($_.PSIsContainer) {
    $ArrayInArray = @{};
    $folderArray1Keys += $_.Name.Trim();
    $ArrayInArray[$_.Name.Trim()] = (Get-ChildItem ./$_).count;
    $folderArray1 += $ArrayInArray;
  }
}

我对$where2执行相同操作,因此我得到$folderArray2$folderArray2Keys

现在比较这两个:

$r=()  #something to save the returns
Compare-Object $folderArray1Keys $folderArray2Keys -IncludeEqual | ForEach-Object {
  if ($_.SideIndicator -eq "=>") {
      $r += ""+$_.InputObect+" only "+$where2+" : "+$folderArray2[$_.InputObject]+" files";
  } elseif ($_.SideIndicator -eq "<=") {
      $r += ""+$_.InputObect+" only "+$where1+" : "+$folderArray1[$_.InputObject]+" files";
  } else {
    if ($folderArray1[$_.InputObject] -gt $folderArray2[$_.InputObject]) {
      $dif = ($folderArray1[$_.InputObject]-$folderArray2[$_.InputObject])
      $r += "on both sides"+$_.InputObject+" has "+$diff+" more files in "+$where1
    } elseif ($folderArray2[$_.InputObject] -gt $folderArray1[$_.InputObject]) {
      $dif = ($folderArray2[$_.InputObject]-$folderArray1[$_.InputObject])
      $r += "on both sides"+$_.InputObject+" has "+$diff+" more files in  "+$where2
    } else {
      $r += ""+$_.InputObject+" is equal on both sides";
    }
  }
}
#Output
$r
cd $a

有些代码不能很好地运行。它表明子文件夹是相同的,显然不是(只因为它们在那里并且完全忽略了数字),不要拼写出单独的文件夹(我最了解的是它(对于双面文件夹这样做))并且不要显示任何数字。我无法弄清楚错误,因为assiocated数组使用PowerShell,我的意思是这样的代码:

$k1="key1";
$v1=1;
$k2="key2";
$v2="value2";
$array=@{};
$array[$k1]=$v1;
$array[$k2]=$v2;
$array[$k1]
$array[$k2]
pause
# Exert
# 1
# value2
# Press any key to continue ...

按预期工作。

1 个答案:

答案 0 :(得分:1)

您的比较例程将$folderArray1$folderArray2视为哈希表,但您将它们定义为哈希表的数组。基本上你是这样做的:

PS C:\> $h = @{}
PS C:\> $h['foo'] = 42
PS C:\> $a = @()
PS C:\> $a += $h
PS C:\> $a['foo']
PS C:\> $a[0]['foo']
42

当你真正想要这个时:

PS C:\> $a = @{}
PS C:\> $a['foo'] = 42
PS C:\> $a['foo']
42

将填充$folderArray变量的代码更改为:

$folderArray = @{}
Get-Childitem | ? { $_.PSIsContainer } | ForEach-Object {
  $folderArray[$_.Name] = @(Get-ChildItem $_.FullName).Count
}

Compare-Object语句:

Compare-Object @($folderArray1.Keys) @($folderArray2.Keys) -IncludeEqual | ...

问题应该消失。