איך להשתמש ב Compare-Object Powershall כאשר אחד מהפרמטרים הוא null
-
אני משתמש בקוד הבא
$folder1Items = Get-ChildItem $folder1 -Recurse | Get-FileHash -Algorithm MD5 $folder2Items = Get-ChildItem $folder2 -Recurse | Get-FileHash -Algorithm MD5 $changes = Compare-Object $folder1Items $folder2Items -Property Name, Path -IncludeEqual
אבל אם 1 מהפרמטרים הוא null הוא מחזיר שגיאה של
Compare-Object : Cannot bind argument to parameter 'DifferenceObject' because it is null. At line:22 char:41 + $changes = Compare-Object $folder1Items $folder2Items -Property Name, ... + ~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Compare-Object], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CompareObje ctCommand
כלומר אם אחד מהפרמטרים לא מכיל שום קובץ אני מקבל את השגיאה הנ"ל.
ברצוני שימשיך להשוות גם מול 0 קבצים כלומר שהתוצאה תהיה שהכל לא תואם. -
ובקיצור:
function Coalesce($a, $b) { if ($a -ne $null) { $a } else { $b } } $folder1Items = Get-ChildItem $folder1 -Recurse | Get-FileHash -Algorithm MD5 $folder2Items = Get-ChildItem $folder2 -Recurse | Get-FileHash -Algorithm MD5 $changes = Compare-Object Coalesce($folder1Items, @()) Coalesce($folder2Items, $()) -Property Name, Path -IncludeEqual
-
@yossiz
מחזיר שגיאהCompare-Object : A positional parameter cannot be found that accepts argument 'Coalesce'. At line:5 char:12 + $changes = Compare-Object Coalesce($folder1Items, @()) Coalesce($fold ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Compare-Object], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.CompareObjectCommand
-
@yossiz , זה אינו מחזיר שגיאה.
אבל הוא לא מזהה לי ==
ראה את הפלט הבא יש שם משהו מוזר עם הקוד שכתבת (כאשר יש קבצים ב2 התיקיות)PS X:\test> function Coalesce($a, $b) { if ($a -ne $null) { $a } else { $b } } $folder1Items = Get-ChildItem $folder1 -Recurse | Get-FileHash -Algorithm MD5 $folder2Items = Get-ChildItem $folder2 -Recurse | Get-FileHash -Algorithm MD5 PS X:\test> Compare-Object $folder1Items $folder2Items -IncludeEqual InputObject SideIndicator ----------- ------------- @{Algorithm=MD5; Hash=9B0888BB0C3833206679572E35E7A71D; Path=X:\Test\Backup.ps1} == @{Algorithm=MD5; Hash=F0E6F573D63B1F92D16A55714F49B063; Path=X:\Test\Untitled1.ps1} == @{Algorithm=MD5; Hash=9A7CA20549218DE334060E3B30CAAEAE; Path=X:\Test\Untitled2.ps1} == @{Algorithm=MD5; Hash=FB404E76315C54940AC9BE72178803D2; Path=X:\Test\Untitled3.ps1} == @{Algorithm=MD5; Hash=DF19BFB4A1F8829AD055854AD8027FBF; Path=X:\Test\zz.ps1} == @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\מצגת של Microsoft PowerPoint חדש.pptx} == @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\hj;j\jhtsezkty yfhgvf gf;.txt} == @{Algorithm=MD5; Hash=0627B4727E2BFE1D1CB7F06B82BFCC5C; Path=X:\Test\hj;j\תיקיה חדשה\jhfd.pub} == @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\uri\שדגכעגכי ד.txt} == @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\uri\מסמך טקסט חדש.txt} == @{Algorithm=MD5; Hash=15EDAC198DFF6373F91CA0E59FA054FD; Path=X:\Test\uri\hgfjf\ggg.accdb} == PS X:\test> Compare-Object (Coalesce $folder1Items @()) (Coalesce $folder2Items$()) -IncludeEqual InputObject SideIndicator ----------- ------------- => @{Algorithm=MD5; Hash=9B0888BB0C3833206679572E35E7A71D; Path=X:\Test\Backup.ps1} <= @{Algorithm=MD5; Hash=F0E6F573D63B1F92D16A55714F49B063; Path=X:\Test\Untitled1.ps1} <= @{Algorithm=MD5; Hash=9A7CA20549218DE334060E3B30CAAEAE; Path=X:\Test\Untitled2.ps1} <= @{Algorithm=MD5; Hash=FB404E76315C54940AC9BE72178803D2; Path=X:\Test\Untitled3.ps1} <= @{Algorithm=MD5; Hash=DF19BFB4A1F8829AD055854AD8027FBF; Path=X:\Test\zz.ps1} <= @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\מצגת של Microsoft PowerPoint חדש.pptx} <= @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\hj;j\jhtsezkty yfhgvf gf;.txt} <= @{Algorithm=MD5; Hash=0627B4727E2BFE1D1CB7F06B82BFCC5C; Path=X:\Test\hj;j\תיקיה חדשה\jhfd.pub} <= @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\uri\שדגכעגכי ד.txt} <= @{Algorithm=MD5; Hash=D41D8CD98F00B204E9800998ECF8427E; Path=X:\Test\uri\מסמך טקסט חדש.txt} <= @{Algorithm=MD5; Hash=15EDAC198DFF6373F91CA0E59FA054FD; Path=X:\Test\uri\hgfjf\ggg.accdb} <= PS X:\test>
-
@yossiz לאחר בדיקה מחודשת מול תיקייה ריקה (מסתבר שמשום מה בתיקייה הקודמת שבדקתי היא לא הייתה ריקה משום מה)
השורה הזו עדיין מחזירה שגיאה של null$changes = Compare-Object (Coalesce $folder1Items @()) (Coalesce $folder2Items @()) -Property Name,Path -IncludeEqual
לאחר בדיקות הוספתי בערך להחלפה
"0"
כך$changes = Compare-Object (Coalesce $folder1Items @("0")) (Coalesce $folder2Items @("0")) -Property Name,Path -IncludeEqual
וזה פתר את הבעיה ואינו מחזיר שגיאה
אני לא יודע אם זה הפתרון המתאים אבל זה עובד
אם יש פתרון נכון יותר אשמח לשמוע.