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

วิธีรับเวอร์ชันไฟล์ใน PowerShell


เราสามารถใช้ PowerShell เพื่อรับเวอร์ชันไฟล์ของไฟล์ใดก็ได้บนคอมพิวเตอร์ของคุณ การรับข้อมูลเวอร์ชันอาจเป็นประโยชน์ในการตรวจสอบว่าการอัปเดตซอฟต์แวร์หรือการปรับใช้สำเร็จหรือไม่ หรือเพื่อจัดทำรายการเวอร์ชันซอฟต์แวร์ในเครื่องต่างๆ

ในบทความนี้ ฉันจะแสดงวิธีรับข้อมูลเวอร์ชันของไฟล์อย่างรวดเร็ว ตรวจสอบว่าเวอร์ชันสูงหรือต่ำกว่าหมายเลขเวอร์ชันที่ระบุ และสร้างฟังก์ชันที่กำหนดเองสำหรับคุณในโปรไฟล์ PowerShell เพื่อให้ง่ายยิ่งขึ้น

PowerShell รับเวอร์ชันไฟล์

ลองมาดูสองสามวิธีในการรับเวอร์ชันไฟล์ใน PowerShell วิธีการส่วนใหญ่ค่อนข้างจะเหมือนกัน ดังนั้นใช้วิธีที่สะดวกที่สุดสำหรับคุณ เราจะใช้ไฟล์ปฏิบัติการ OneDrive เป็นตัวอย่างสำหรับสิ่งนี้

ใช้รับรายการ

วิธีที่แนะนำมากที่สุดในการรับข้อมูลเวอร์ชันคือการใช้ cmdlet Get-Item คุณสมบัติ FileVersion เป็นส่วนหนึ่งของคุณสมบัติ VersionInfo โดยการวาง Get-Item cmdlet ระหว่างวงเล็บ เราจะได้หมายเลขเวอร์ชันที่สมบูรณ์ได้อย่างง่ายดาย:

# Set the file path (will be using this in all examples)
$file = "C:\Program Files\Microsoft OneDrive\OneDrive.exe"

# Get version information with Get-Item
(Get-Item $file).VersionInfo.FileVersion

แทนที่จะเป็นหมายเลขเวอร์ชันไฟล์ที่สมบูรณ์ เรายังสามารถรับหมายเลขเวอร์ชันดิบได้อีกด้วย การดำเนินการนี้จะแบ่งตัวเลขออกเป็นหมายเลขหลัก หมายเลขรอง หมายเลขรุ่น และหมายเลขแก้ไข

สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการตรวจสอบหมายเลขบิลด์หลักหรือรองของแอปพลิเคชันเท่านั้น

(Get-Item $file).VersionInfo.FileVersionRaw

# Result
Major  Minor  Build  Revision
-----  -----  -----  --------
24     181    908    1

การใช้ Get-ChildItem หรือ Get-ItemProperty

แทนที่จะเป็น Get-Item cmdlet เรายังสามารถใช้ Get-ChildItem หรือ Get-ItemProperty cmdlet ได้ด้วย ตามที่กล่าวไว้ทั้ง 3 วิธีค่อนข้างจะเหมือนกัน:

# Using Get-ChildItem
(Get-ChildItem $file).VersionInfo.FileVersion

# Using Get-ItemProperty
(Get-ItemProperty $file).VersionInfo.FileVersion

ฉันได้ทำการทดสอบบางอย่างเพื่อตรวจสอบว่าวิธีใดวิธีหนึ่งเร็วกว่าหรือไม่ และตามที่คาดไว้ ความแตกต่างระหว่างทั้งสามวิธีนั้นมีน้อยมากหลังจากทำการทดสอบ 50 ครั้ง:

  • เวลาเฉลี่ยในการรับรายการ: 1.078332 ms
  • เวลาเฉลี่ยสำหรับ Get-ChildItem: 1.108278 ms
  • เวลาเฉลี่ยสำหรับ Get-ItemProperty: 1.02891 ms

การใช้คลาส System.Diagnostics.FileVersionInfo .NET

อีกวิธีหนึ่งในการรับข้อมูลเวอร์ชันของไฟล์คือการใช้คลาส System.Diagnostics.FileVersionInfo .NET ข้อดีของการใช้คลาส .NET โดยตรงคือเร็วกว่าอีกสามวิธีอื่นๆ

([System.Diagnostics.FileVersionInfo]::GetVersionInfo($file)).FileVersion

ความแตกต่างไม่ได้ใหญ่มาก แต่เมื่อคุณต้องการรับข้อมูลเวอร์ชันสำหรับไฟล์จำนวนมากหรือตรวจสอบในเครื่องหลาย ๆ เครื่อง สิ่งนี้อาจช่วยคุณประหยัดเวลาได้ ด้วยคลาส .NET ใช้เวลาเฉลี่ยเพียง 0.79294 มิลลิวินาทีในการรับข้อมูลเวอร์ชัน ทำให้เร็วกว่าวิธีอื่นๆ ประมาณ 20%

ฟังก์ชันที่กำหนดเอง Get-FileVersion

หากคุณต้องการตรวจสอบเวอร์ชันของไฟล์เป็นประจำ การสร้างฟังก์ชันแบบกำหนดเองและจัดเก็บไว้ในโปรไฟล์ PowerShell ของคุณอาจคุ้มค่า ด้วยวิธีนี้ คุณสามารถดึงข้อมูลเวอร์ชันได้อย่างง่ายดายด้วยคำสั่งที่จำง่าย แทนที่จะใช้ cmdlet Get-Item พร้อมคุณสมบัติที่ถูกต้องทั้งหมด

คุณสามารถคัดลอกและวางฟังก์ชันด้านล่างลงในโปรไฟล์ PowerShell ของคุณได้:

function Get-FileVersion {
    param (
        [string]$FilePath,
        [switch]$raw = $false
    )

    if (-not (Test-Path $FilePath)) {
        Write-Error "File not found: $FilePath"
        return
    }

    try {
        $versionInfo = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($FilePath)

        if (-not($raw)) {
            return $versionInfo.FileVersion
        }else{
            return $versionInfo.FileVersionRaw
        }
    } catch {
        Write-Error "Unable to get version info for: $FilePath"
    }
}

วิธีนี้คุณสามารถใช้ cmdlet ต่อไปนี้ในเซสชัน PowerShell ของคุณ:

Get-FileVersion "C:\Program Files\Microsoft OneDrive\OneDrive.exe"

ตามค่าเริ่มต้น ระบบจะส่งคืนหมายเลข FileVersion สำหรับไฟล์ที่กำหนด หากคุณเพิ่มพารามิเตอร์ -raw คุณจะได้รับหมายเลขเวอร์ชันที่แบ่งออกเป็นรุ่นหลัก รุ่นรอง รุ่นและรุ่นแก้ไข

การเปรียบเทียบเวอร์ชันของไฟล์

เมื่อคุณต้องการเปรียบเทียบเวอร์ชันของไฟล์ สิ่งสำคัญคือต้องแปลงหมายเลขเวอร์ชันเป็นประเภท [เวอร์ชัน] มิฉะนั้น PowerShell จะทำการเปรียบเทียบสตริงซึ่งไม่ถูกต้องเมื่อใช้ร่วมกับหมายเลขเวอร์ชัน

ประเภท [เวอร์ชัน] ถูกสร้างขึ้นเพื่อเปรียบเทียบเวอร์ชันที่มีส่วนประกอบที่เป็นตัวเลขหลายส่วน เช่น หมายเลขหลัก หมายเลขรอง รุ่น และหมายเลขการแก้ไข วิธีนี้ PowerShell รู้วิธีจัดการการเปรียบเทียบระหว่างหมายเลขเวอร์ชันที่ไม่สามารถทำได้ด้วยการเปรียบเทียบสตริงปกติ

# Get the file version and cast it to a [Version] object
$version = [Version]((Get-Item $file).VersionInfo.FileVersion)

# Define the target version for comparison, also cast to [Version]
$targetVersion = [Version]"24.180.708.1"

# Compare the versions
if ($version -gt $targetVersion) {
    Write-Host "The file version is newer than 24.180.708.1"
} else {
    Write-Host "The file version is older or equal to 24.180.708.1"
}

ห่อขึ้น

มีสองวิธีในการรับข้อมูลเวอร์ชันของไฟล์ด้วย PowerShell อย่างไรก็ตาม cmdlet ปกติจะค่อนข้างเหมือนกันมาก ในแง่ของการใช้งานและประสิทธิภาพ

หากคุณต้องการดึงข้อมูลจากไฟล์จำนวนมาก คลาส .NET ที่เร็วกว่าก็เหมาะสมแล้ว นอกจากนี้ ตรวจสอบให้แน่ใจว่าคุณลองใช้ฟังก์ชันแบบกำหนดเองในโปรไฟล์ PowerShell ของคุณ

หวังว่าคุณจะชอบบทความนี้ หากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง