Bagaimana Anda bisa mendapatkan informasi versi dari .dll
atau .exe
file di PowerShell?
Saya secara khusus tertarik File Version
, meskipun informasi versi lainnya (yaitu, Company
, Language
, Product Name
, dll) akan membantu juga.
file
powershell
versioninfo
Kaisar XLII
sumber
sumber
get-item C:\Windows\System32\ubpm.dll | % VersionInfo | fl * -force
dan bandingkan FilePrivatePart dengan bagian terakhir dari FileVersion. FileVersion menunjukkan apa yang awalnya dikirim, dan bukan versi yang ditambal. Perintah ini, di sisi lain, menunjukkan nomor versi yang ditambal: (get-command C: \ Windows \ System32 \ ubpm.dll)(Get-Command ... ).Version
mengembalikan ProductVersion bukan FileVersion , dan terkadang itu penting. Jadi untuk solusi lengkap yang benar-benar mengembalikan FileVersion yang diperbarui , lihat contoh Update-TypeData dalam jawaban saya di bawah ini.Saat ini Anda bisa mendapatkan FileVersionInfo dari Get-Item atau Get-ChildItem, tetapi itu akan menampilkan FileVersion asli dari produk yang dikirim, dan bukan versi yang diperbarui. Misalnya:
Menariknya, Anda bisa mendapatkan ProductVersion yang diperbarui (ditambal) dengan menggunakan ini:
Perbedaan yang saya buat antara "asli" dan "ditambal" pada dasarnya karena cara FileVersion dihitung ( lihat dokumen di sini ). Pada dasarnya sejak Vista, Windows API GetFileVersionInfo menanyakan bagian dari informasi versi dari file netral bahasa (exe / dll) dan bagian tidak tetap dari file mui khusus bahasa (yang tidak diperbarui setiap kali file berubah ).
Jadi dengan file seperti lsasrv (yang diganti karena masalah keamanan di SSL / TLS / RDS pada November 2014) versi yang dilaporkan oleh kedua perintah ini (setidaknya untuk sementara waktu setelah tanggal itu) berbeda, dan yang kedua adalah lebih banyak versi "benar".
Namun, meskipun itu benar di LSASrv, dimungkinkan untuk ProductVersion dan FileVersion menjadi berbeda (itu umum, sebenarnya). Jadi satu-satunya cara untuk mendapatkan Fileversion yang diperbarui langsung dari file assembly adalah dengan membangunnya sendiri dari bagian-bagiannya, seperti ini:
Atau dengan menarik data dari ini:
Anda dapat dengan mudah menambahkan ini ke semua objek FileInfo dengan memperbarui TypeData di PowerShell:
Sekarang setiap kali Anda melakukannya
Get-ChildItem
atauGet-Item
Anda akan memilikiFileVersion
properti yang menampilkan FileVersion yang diperbarui ...sumber
(Get-Command C:\Path\YourFile.Dll).FileVersionInfo.FileVersion
Get-Command
aplikasi file dll. Bisakah Anda menguraikan efeknya?(Get-Item C:\Windows\System32\Lsasrv.dll).VersionInfo.ProductVersion
cara baru yang lebih sederhana untuk mendapatkan informasi ProductVersion yang sama seperti yang didokumentasikan dalam jawabannya? Saya tidak benar-benar percaya Microsoft untuk menggunakan istilah iniProductVersion
secara konsisten.'dir' adalah alias untuk Get-ChildItem yang akan mengembalikan kelas System.IO.FileInfo saat Anda memanggilnya dari sistem file yang memiliki VersionInfo sebagai properti. Jadi ...
Untuk mendapatkan info versi satu file, lakukan ini:
Untuk banyak file ini:
sumber
Saya lebih suka menginstal Ekstensi Komunitas PowerShell dan cukup gunakan fungsi Get-FileVersionInfo yang disediakannya.
Seperti itu:
dengan output seperti:
Saya telah menggunakannya terhadap seluruh direktori majelis dengan sukses besar.
sumber
Saya menyadari ini sudah dijawab, tetapi jika ada yang tertarik untuk mengetik lebih sedikit karakter, saya yakin ini adalah cara terpendek menulis ini di PS v3 +:
ls
adalah alias untukGet-ChildItem
%
adalah alias untukForEach-Object
versioninfo
di sini adalah cara penulisan yang singkat{$_.VersionInfo}
Manfaat menggunakan
ls
cara ini adalah Anda dapat dengan mudah mengadaptasinya untuk mencari file yang diberikan dalam subfolder. Misalnya, perintah berikut akan mengembalikan info versi untuk semua file yang dipanggilapplication.exe
dalam subfolder:-r
adalah alias untuk-Recurse
Anda dapat memperbaiki ini lebih lanjut dengan menambahkan
-ea silentlycontinue
untuk mengabaikan hal-hal seperti kesalahan izin dalam folder yang tidak dapat Anda cari:-ea
adalah alias untuk-ErrorAction
Terakhir, jika Anda mendapatkan elips (...) di hasil Anda, Anda dapat menambahkan
| fl
untuk mengembalikan informasi dalam format yang berbeda. Ini menghasilkan lebih banyak detail, meskipun diformat dalam daftar, bukan pada satu baris per hasil:fl
adalah alias untukFormat-List
Saya menyadari ini sangat mirip dengan balasan xcud dalam hal itu
ls
dandir
keduanya alias untukGet-ChildItem
. Tapi saya berharap metode "terpendek" saya akan membantu seseorang.Contoh terakhir dapat ditulis dengan tulisan tangan sebagai berikut:
... tapi saya pikir cara saya lebih dingin dan, bagi sebagian orang, lebih mudah diingat. (Tapi kebanyakan lebih dingin).
sumber
Cara lain untuk melakukannya adalah dengan menggunakan teknik akses file bawaan:
Anda juga bisa mendapatkan properti tertentu dari VersionInfo, dengan demikian:
Ini cukup dekat dengan teknik dir.
sumber
Ini didasarkan pada jawaban lain, tetapi persis seperti apa yang saya cari:
sumber
Get-Command
aplikasi file dll. Bisakah Anda menguraikan efeknya (bahkan sebelum memanggil properti FileVersionInfo)?FileVersionInfo
seperti halnya file exe. Menerapkan perintah ini ke jalur akan mendapatkan info versi file!sumber
Saya menemukan ini berguna:
sumber
Seperti yang dikatakan EBGreen, [System.Diagnostics.FileVersionInfo] :: GetVersionInfo (path) akan berfungsi, tetapi ingat bahwa Anda juga bisa mendapatkan semua anggota FileVersionInfo, misalnya:
Anda harus dapat menggunakan setiap anggota FileVersionInfo yang didokumentasikan di sini, yang pada dasarnya akan memberi Anda apa pun yang Anda inginkan tentang file tersebut.
sumber
Berikut metode alternatif. Ini menggunakan Get-WmiObject CIM_DATAFILE untuk memilih versi.
sumber