PowerShell เปรียบเทียบ LastWriteTime ของสองไฟล์ [4 วิธี]
การใช้คุณสมบัติ LastWriteTime
หากต้องการเปรียบเทียบ LastWriteTime ของสองไฟล์ใน PowerShell:
- ใช้
Get-Itemเพื่อรับไอเท็ม - ใช้บล็อก
if-elseเพื่อเปรียบเทียบLastWriteTimeของทั้งสองไฟล์
ใช้ตัวดำเนินการ -eq:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
if ($fileName1.LastWriteTime -eq $fileName2.LastWriteTime) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
}
elseif ($fileName1.LastWriteTime -gt $fileName2.LastWriteTime) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater than '$($fileName2.Name)'"
}
else{
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater lesser '$($fileName2.Name)'"
}เอาท์พุท :
The LastWriteTime of the 'file1.txt' is greater than 'file2.txt'ใช้ Compare-Object Cmdlet
หากต้องการเปรียบเทียบ LastWriteTime ของสองไฟล์ใน PowerShell:
- ใช้
Get-Itemเพื่อรับไอเท็ม - ใช้
Compare-Objectcmdlet เพื่อเปรียบเทียบLastWriteTimeของสองไฟล์ใน PowerShell - ใช้บล็อก
if-elseเพื่อตรวจสอบว่าLastWriteTimeของทั้งสองไฟล์เหมือนกันหรือไม่
ใช้ Compare-Object Cmdlet:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
$fileComparison = Compare-Object -ReferenceObject $fileName1.LastWriteTime -DifferenceObject $fileName2.LastWriteTime
if ($fileComparison -eq $null) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
} else {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is different."
}เอาท์พุท :
The LastWriteTime of the 'file1.txt' and 'file2.txt' is different.ขั้นแรก เราใช้ Get-Item cmdlet เพื่อรับไอเท็มในตำแหน่งที่กำหนด และจัดเก็บไว้ในตัวแปร $fileName1 และ $fileName2 cmdlet นี้ใช้เพื่อรับรายการจากตำแหน่งที่ระบุเท่านั้น ไม่ใช่เนื้อหา เว้นแต่เราจะใช้อักขระตัวแทน (*) เพื่อขอเนื้อหาทั้งหมดของรายการ โปรดทราบว่าผู้ให้บริการ PowerShell ใช้ cmdlet นี้เพื่อสำรวจผ่านที่เก็บข้อมูลประเภทต่างๆ
จากนั้น เราใช้ Compare-Object cmdlet เพื่อเปรียบเทียบ LastWriteTime ของ $fileName1 & $fileName2 และบันทึกไว้ใน $fileComparison ตัวแปร cmdlet นี้ใช้เพื่อเปรียบเทียบวัตถุสองชุดใน PowerShell ในที่นี้ ออบเจ็กต์ชุดแรกคือ ReferenceObject ในขณะที่ชุดที่สองของออบเจ็กต์คือ DifferenceObject ในกรณีของเรา $fileName1.LastWriteTime คือ reference และ $fileName2.LastWriteTime คือ Difference
Compare-Object พิจารณาวิธีการที่มีอยู่ซึ่งสามารถใช้เพื่อเปรียบเทียบวัตถุทั้งหมด หากไม่พบวิธีที่เหมาะสม ระบบจะใช้ ToString() เพื่อเปรียบเทียบผลลัพธ์ของสตริง ในขณะที่ใช้ cmdlet นี้ เราสามารถจัดเตรียมคุณสมบัติหนึ่งหรือหลายรายการที่สามารถใช้ในการเปรียบเทียบได้
เมื่อมีการระบุคุณสมบัติ
Compare-Objectcmdlet จะเปรียบเทียบเฉพาะค่าของคุณสมบัติเหล่านั้นเท่านั้น
ผลลัพธ์ของการเปรียบเทียบแสดงว่าคุณสมบัติที่ระบุปรากฏใน DifferenceObject (=>) เท่านั้น หรือ ReferenceObject (<=) เท่านั้น ในทางกลับกัน หากใช้ IncludeEqual ตัวดำเนินการ == จะแสดงว่ามีค่าอยู่ในวัตถุทั้งสอง
สุดท้าย เราใช้บล็อก if-else เพื่อเปรียบเทียบ $fileComparison กับ $null โดยใช้ -eq ( เท่ากับ) ตัวดำเนินการ หากค่าของตัวแปร $fileComparison เท่ากับ null เราใช้ Write-Host cmdlet เพื่อพิมพ์ข้อความว่า LastWriteTime เหมือนกัน ; มิฉะนั้นจะแตกต่างออกไป
โปรดจำไว้ว่า หาก ReferenceObject หรือ DifferenceObject เป็น null ($null) ดังนั้น Compare-Object จะสร้าง ข้อผิดพลาดในการยุติโดยบอกว่าไม่สามารถผูกอาร์กิวเมนต์กับพารามิเตอร์ DifferenceObject ได้เนื่องจากเป็นค่าว่าง ดูตัวอย่างต่อไปนี้เพื่อทำให้แนวคิดของคุณชัดเจน
ใช้ Compare-Object Cmdlet:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = $null
$fileComparison = Compare-Object -ReferenceObject $fileName1.LastWriteTime -DifferenceObject $fileName2.LastWriteTime
if ($fileComparison -eq $null) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
} else {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is different."
}
คำอธิบายข้อผิดพลาด:
Compare-Object: Cannot bind argument to parameter 'DifferenceObject' because it is null.เราได้รับข้อผิดพลาดข้างต้นเนื่องจาก $fileName2 ถูกตั้งค่าเป็น null ($null)
ใช้ New-TimeSpan Cmdlet
หากต้องการเปรียบเทียบ LastWriteTime ของสองไฟล์ใน PowerShell:
- ใช้ cmdlet
Get-Itemเพื่อรับไอเท็มจากตำแหน่งที่กำหนด - ใช้ cmdlet
New-TimeSpanเพื่อสร้างวัตถุTimeSpanใน PowerShell - ใช้บล็อก
if-elseเพื่อตรวจสอบว่าLastWriteTimeของทั้งสองไฟล์เหมือนกันหรือแตกต่างกัน
ใช้ New-TimeSpan Cmdlet:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
$lastWriteTimeDifference = New-TimeSpan $fileName1.LastWriteTime $fileName2.LastWriteTime
if ($lastWriteTimeDifference.TotalSeconds -eq 0) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is the same."
}
elseif ($fileName1.LastWriteTime -gt 0) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater than '$($fileName2.Name)'"
}
else{
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater lesser '$($fileName2.Name)'"
}เอาท์พุท :
The LastWriteTime of the 'file1.txt' is greater than 'file2.txt'ข้อมูลโค้ดนี้คล้ายกับตัวอย่างแรกในส่วนก่อนหน้า ซึ่งเราใช้ Compare-Object cmdlet ยกเว้นความแตกต่างสองประการ ขั้นแรก เราใช้ New-TimeSpan cmdlet; อย่างที่สองคือต้องมีการแสดงออกที่แตกต่างกันในคำสั่ง if New-TimeSpan cmdlet ใช้เพื่อสร้างวัตถุ TimeSpan ที่เราเก็บไว้ในตัวแปร $lastWriteTimeDifference ซึ่งแสดงถึงช่วงเวลาที่เราสามารถใช้เพื่อเพิ่มหรือลบเวลาจาก < รหัส>DateTimeวัตถุ
หากเราไม่ใช้พารามิเตอร์ใดๆ
New-TimeSpancmdlet จะส่งกลับอ็อบเจ็กต์TimeSpanซึ่งแสดงถึงช่วงเวลา0
ในที่นี้ เราใช้คำสั่ง if พร้อมด้วยตัวดำเนินการ -eq (เท่ากับ) เพื่อเปรียบเทียบว่าค่าของคุณสมบัติ TotalSeconds ของ $lastWriteTimeDifference ออบเจ็กต์เท่ากับ 0 หากเป็นเช่นนั้น บล็อก if จะถูกดำเนินการ มิฉะนั้น บล็อก elseif จะตรวจสอบว่าค่าของคุณสมบัติ TotalSeconds ของอ็อบเจ็กต์ $lastWriteTimeDifference มากกว่าถึง 0 หรือไม่ ; มิฉะนั้นจะถูกดำเนินการ
สมมติว่าเรามีไฟล์จำนวน n ในตำแหน่งเฉพาะที่เราต้องการเปรียบเทียบ LastWriteTime ของไฟล์หนึ่งกับไฟล์ที่เหลือ จากนั้นเราสามารถใช้แนวทางต่อไปนี้เพื่อตอบสนองความต้องการของโครงการได้
ใช้ Get-ItemProperty Cmdlet
หากต้องการเปรียบเทียบ LastWriteTime ของสองไฟล์ใน PowerShell:
- ใช้ cmdlet
Get-ChildItemเพื่อรับรายการ/รายการย่อยจากตำแหน่งที่กำหนด - ใช้ Where-Object cmdlet เพื่อกรองวัตถุที่ได้รับจาก cmdlet
Get-ChildItem - บันทึกออบเจ็กต์ไฟล์แรกและ
LastWriteTimeไว้ในตัวแปรที่แยกกันสองตัว - ใช้ลูป
foreachเพื่อวนซ้ำอ็อบเจ็กต์ที่ถูกกรองทั้งหมด -
ในการวนซ้ำแต่ละครั้ง:
- ใช้
Get-ItemPropertycmdlet เพื่อรับคุณสมบัติlastwritetimeของรายการที่ระบุ
- ใช้
- ใช้บล็อก
if-elseที่มีตัวดำเนินการเปรียบเทียบ-gtและ-ltเพื่อเปรียบเทียบLastWriteTime - ใช้
Write-Outputcmdlet เพื่อพิมพ์ว่าเวลาเขียนล่าสุดของไฟล์แรกเท่ากัน เก่ากว่า หรือใหม่กว่าไฟล์ปัจจุบัน
ใช้ Get-ItemProperty Cmdlet:
$source = "E:\Test"
$allFiles =Get-ChildItem $source | Where-Object { !$_.PSIsContainer }
$firstFile = $allFiles[0]
$firstFileLastWriteTime = [datetime](Get-ItemProperty -Path $firstFile.FullName -Name LastWriteTime).LastWriteTime
foreach ($file in $allFiles) {
$dateTime = [datetime](Get-ItemProperty -Path $file.FullName -Name LastWriteTime).lastwritetime
if ($dateTime -gt $firstFileLastWriteTime) {
Write-Output "$($file.Name) - Last Write Time is newer than $($firstFile.Name)"
} elseif ($dateTime -lt $firstFileLastWriteTime) {
Write-Output "$($file.Name) - Last Write Time is older than $($firstFile.Name)"
} else {
Write-Output "$($file.Name) - Last Write Time is the same as $($firstFile.Name)"
}
}เอาท์พุท :
computersList.txt - Last Write Time is the same as computersList.txt
file - Copy.doc - Last Write Time is older than computersList.txt
file - Copy.pdf - Last Write Time is newer than computersList.txt
file.docx - Last Write Time is older than computersList.txt
file.pdf - Last Write Time is newer than computersList.txt
file2.txt - Last Write Time is older than computersList.txt
file3.txt - Last Write Time is older than computersList.txt
file4.txt - Last Write Time is older than computersList.txt
testPS.ps1 - Last Write Time is newer than computersList.txtขั้นแรก เราได้กำหนดและเริ่มต้นตัวแปรชื่อ $source ด้วยเส้นทางของตำแหน่งต้นทาง ซึ่งก็คือ E:\Test ในกรณีของเรา ต่อไป เราใช้ Get-ChildItem cmdlet เพื่อดึงข้อมูลรายการในตำแหน่งที่ระบุ ซึ่งก็คือ $source ในตัวอย่างข้างต้น โปรดจำไว้ว่า Get-ChildItem สามารถรับไอเท็มและไอเท็มย่อยจากไดเร็กทอรีและไดเร็กทอรีย่อยที่กำหนด และส่งกลับเป็น System.IO.FileInfo และ System.IO วัตถุ DirectoryInfo
เนื่องจากเราสนใจเฉพาะไฟล์และไม่ต้องการเจาะลึกเข้าไปในไดเร็กทอรีหรือไดเร็กทอรีย่อย เราจึงใช้ Where-Object cmdlet เพื่อกรองและเลือกออบเจ็กต์เหล่านั้นที่ไม่ใช่คอนเทนเนอร์ (ไดเร็กทอรี) ยังไง? มาทำความเข้าใจกันเถอะ ในนิพจน์ { !$_.PSIsContainer นั้น {} หมายถึงบล็อกสคริปต์ $_ หมายถึงอ็อบเจ็กต์ปัจจุบันในไปป์ไลน์ และ ! ใช้เพื่อลบล้างค่าของคุณสมบัติ PSIsContainer หมายความว่า Where-Object จะกรองคอนเทนเนอร์ทั้งหมดและเลือกเฉพาะออบเจ็กต์ที่ไม่ใช่คอนเทนเนอร์ จากนั้น เราเก็บค่าผลลัพธ์ไว้ในตัวแปร $allFiles
หลังจากนั้น เราดึงไฟล์แรกโดยใช้ $allFiles[0] และเก็บไว้ในตัวแปร $firstFile นอกจากนี้เรายังจัดเก็บ LastWriteTime ของ $firstFile ไว้ในตัวแปร $firstFileLastWriteTime
ต่อไป เราใช้ลูป foreach เพื่อวนซ้ำบน $allFiles ในการวนซ้ำทุกครั้ง เราใช้ Get-ItemProperty cmdlet เพื่อรับคุณสมบัติของรายการปัจจุบัน ในโค้ดข้างต้น เราได้คุณสมบัติ lastwritetime เปลี่ยนประเภทเป็น DATETIME โดยใช้ [datetime] และเก็บไว้ใน $ตัวแปร dateTime หลังจากนั้น เราใช้บล็อก if-else พร้อมด้วยตัวดำเนินการ -gt และ -lt เพื่อเปรียบเทียบ LastWriteTime ของ $firstFile พร้อมเวลาเขียนล่าสุดของรายการปัจจุบัน และตรวจสอบว่ารายการเก่ากว่า เหมือนเดิม หรือใหม่กว่าเวลาเขียนล่าสุดของไฟล์แรก
ในแต่ละบล็อกแบบมีเงื่อนไข เรา Write-Output cmdlet เพื่อพิมพ์ชื่อของรายการปัจจุบัน (ชื่อไฟล์) และอธิบายว่าเวลาในการเขียนครั้งล่าสุดเท่ากัน เก่ากว่า หรือใหม่กว่า computersList.txt ซึ่งเป็นไฟล์แรกของเรา เราสามารถใช้วิธีแก้ปัญหาต่อไปนี้หากคุณต้องการ Mode, LastWriteTime, Length และ Name ของไฟล์ทั้งหมด ในตำแหน่งที่ระบุ
การใช้คำสั่ง ls
ใช้คำสั่ง ls เพื่อแสดงรายการ LastWriteTime ของไฟล์หลายไฟล์ในตำแหน่งที่ระบุซึ่ง LastWriteTime มีค่ามากกว่าหนึ่งวัน
ใช้คำสั่ง ls:
ls | where-object {(new-timespan $_.LastWriteTime).days -ge 1}เอาท์พุท :
Directory: E:\Test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2/8/2023 9:26 PM 196 file1.txt
-a---- 2/8/2023 9:31 PM 83 file2.txt
-a---- 2/18/2023 12:18 PM 82 file3.txtเราได้เรียนรู้คำสั่งทั้งหมดที่ใช้ในตัวอย่างนี้แล้ว คุณอาจเห็น ls เป็นคำสั่งใหม่ แต่นั่นคือนามแฝงของ Get-ChildItem cmdlet ที่อธิบายไว้แล้วในส่วนก่อนหน้า ls ดึงข้อมูลไฟล์และไดเร็กทอรีย่อยทั้งหมดในไดเร็กทอรีปัจจุบันที่ส่งต่อไปยัง Where-Object cmdlet โดยใช้ไปป์ไลน์ (|) โดยที่ Where-Object กรองตามคุณสมบัติ LastWriteTime
เราได้เรียนรู้แล้วว่า cmdlet New-TimeSpan สร้างวัตถุ TimeSpan; ในที่นี้ คุณสมบัติ Days แสดงถึงจำนวนวันทั้งหมดในช่วงเวลาหนึ่ง นิพจน์ที่นำหน้าด้วย cmdlet Where-Object กำหนดว่าคุณสมบัติ Days ของวัตถุ TimeSpan นั้นมากกว่าหรือเท่ากับ 1 ซึ่งหมายความว่ารายการปัจจุบันถูกเขียนครั้งล่าสุดมากกว่าหนึ่งวันที่ผ่านมา หากนิพจน์นี้เป็น True รายการปัจจุบันจะถูกเพิ่มลงในเอาต์พุต
หากคุณสนใจเฉพาะ วัน, วันที่ และ เวลา เราสามารถใช้ ls ดังต่อไปนี้
ใช้คำสั่ง ls:
$source = "E:\Test"
(ls $source).LastWriteTimeเอาท์พุท :
Wednesday, February 8, 2023 9:26:59 PM
Wednesday, February 8, 2023 9:31:21 PM
Saturday, February 18, 2023 12:18:35 PMเราสามารถทำการเปรียบเทียบที่แตกต่างกันในตัวอย่างข้างต้นทั้งหมดตามความต้องการของโครงการของเรา เช่น
-gt(greater than),lt(น้อยกว่า),-ge(มากกว่าหรือเท่ากับ) หรือ-le(น้อยกว่าหรือเท่ากับ)
นั่นคือทั้งหมดที่เกี่ยวกับ PowerShell เปรียบเทียบ LastWriteTime ของสองไฟล์
