วิธีรับเวอร์ชันไฟล์ใน 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 ของคุณ
หวังว่าคุณจะชอบบทความนี้ หากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง

