ค้นหาเว็บไซต์

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-Object cmdlet เพื่อเปรียบเทียบ 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-Object cmdlet จะเปรียบเทียบเฉพาะค่าของคุณสมบัติเหล่านั้นเท่านั้น

ผลลัพธ์ของการเปรียบเทียบแสดงว่าคุณสมบัติที่ระบุปรากฏใน 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-TimeSpan cmdlet จะส่งกลับอ็อบเจ็กต์ 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-ItemProperty cmdlet เพื่อรับคุณสมบัติ lastwritetime ของรายการที่ระบุ
    • ใช้บล็อก if-else ที่มีตัวดำเนินการเปรียบเทียบ -gt และ -lt เพื่อเปรียบเทียบ LastWriteTime
    • ใช้ Write-Output cmdlet เพื่อพิมพ์ว่าเวลาเขียนล่าสุดของไฟล์แรกเท่ากัน เก่ากว่า หรือใหม่กว่าไฟล์ปัจจุบัน

ใช้ 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 ของสองไฟล์

บทความที่เกี่ยวข้อง