我想将2个给定文件夹的子文件夹中的文件数与PowerShell脚本进行比较,但是有些东西无效。
我通过用户输入获得了2个文件夹的路径并保存了它们
在变量$where1
和$where2
中,我还将脚本开始的位置保存到变量$a
中。我更改为给定的文件夹,以获取有关子文件夹的信息到2个数组,一个辅助数组$folderArrayX
,其数字如此$folderArrayX["subfolder1"]=x
(x
是子文件夹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 ...
按预期工作。
答案 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 | ...
问题应该消失。