איך להשתמש ב 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 -
ובקיצור:
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
מחזיר שגיאה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 -
@אוריי טעות שלי
התחביר הנכון הוא ככה:
$changes = Compare-Object (Coalesce $folder1Items @()) (Coalesce $folder2Items @()) -Property Name,Path -IncludeEqualאגב, אין מאפיין של
Name@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וזה פתר את הבעיה ואינו מחזיר שגיאה
אני לא יודע אם זה הפתרון המתאים אבל זה עובד
אם יש פתרון נכון יותר אשמח לשמוע.
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות