2010-07-16 34 views
31

Tôi muốn có thể lấy phiên bản tệp và phiên bản lắp ráp của tất cả các tệp DLL trong một thư mục và tất cả các thư mục con của nó. Tôi mới lập trình, và tôi không thể tìm ra cách làm cho vòng lặp này hoạt động.Tải phiên bản tập tin và phiên bản lắp ráp của các tệp DLL trong thư mục hiện tại và tất cả các thư mục con

tôi có mã này PowerShell để có được phiên bản lắp ráp (lấy từ một diễn đàn):

$strPath = 'c:\ADMLibrary.dll' 
$Assembly = [Reflection.Assembly]::Loadfile($strPath) 

$AssemblyName = $Assembly.GetName() 
$Assemblyversion = $AssemblyName.version 

Và đây cũng như:

$file = Get-ChildItem -recurse | %{ $_.VersionInfo } 

Làm thế nào tôi có thể làm cho một vòng lặp trong số này quá mà tôi có thể trả về phiên bản lắp ráp của tất cả các tệp trong một thư mục?

Trả lời

26

Là một xấu xí một liner:

Get-ChildItem -Filter *.dll -Recurse | 
    ForEach-Object { 
     try { 
      $_ | Add-Member NoteProperty FileVersion ($_.VersionInfo.FileVersion) 
      $_ | Add-Member NoteProperty AssemblyVersion (
       [Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version 
      ) 
     } catch {} 
     $_ 
    } | 
    Select-Object Name,FileVersion,AssemblyVersion 

Nếu bạn chỉ muốn thư mục hiện hành, sau đó rõ ràng là bỏ qua tham số -Recurse. Nếu bạn muốn tất cả các tệp thay vì chỉ các tệp DLL, thì hãy xóa thông số -Filter và đối số của nó. Mã này (hy vọng) khá đơn giản.

Tôi khuyên bạn nên tắt các phần khó chịu trong khối try thành các chức năng riêng biệt vì điều đó sẽ khiến lỗi xử lý ít khó xử hơn ở đây.

đầu ra

mẫu:

Name         FileVersion  AssemblyVersion 
----         -----------  --------------- 
Properties.Resources.Designer.cs.dll 0.0.0.0   0.0.0.0 
My Project.Resources.Designer.vb.dll 0.0.0.0   0.0.0.0 
WindowsFormsControlLibrary1.dll   1.0.0.0   1.0.0.0 
WindowsFormsControlLibrary1.dll   1.0.0.0   1.0.0.0 
WindowsFormsControlLibrary1.dll   1.0.0.0   1.0.0.0 
+0

này hoạt động, nhưng tiếc là nó tải các tập tin và không bao giờ giải phóng họ ... Chạy nó và sau đó cố gắng xóa một trong các tệp đó. –

+1

Đó thực sự là một nhược điểm. Bạn có thể phá vỡ điều này bằng cách sinh ra một cá thể PowerShell mới: 'powershell -NoProfile -OutputFormat XML -EncodedCommand $ encodedCommand |% {$ _}' với '$ encodedCommand' là biến thể được mã hóa Base64 của đoạn mã trên (xem' powershell /? 'cho một mẫu làm thế nào để có được nó). Điều này sẽ mang lại các đối tượng tương tự mà nếu không sẽ được sản xuất, nhưng vỏ tải các tập tin không còn sống bây giờ. – Joey

+0

Tôi đang cố gắng tải các hội đồng vào AppDomain mới và dỡ bỏ nó sau này, nhưng nó không hoạt động - bộ nạp assembly tìm kiếm các assembly trong thư mục PowerShell (C: /windows/system32/WindowsPowerShell/v1.0) mặc dù tôi đã thiết lập thư mục cơ sở khi tạo tên miền mới ... –

47

Đây là một khá lót:

Get-ChildItem -Filter *.dll -Recurse | Select-Object -ExpandProperty VersionInfo 

Nói tóm lại cho PowerShell phiên bản 2:

ls -fi *.dll -r | % { $_.versioninfo } 

Nói tóm lại cho PowerShell phiên bản 3 như đề xuất bởi tamasf:

ls *.dll -r | % versioninfo 
+6

Tóm tắt: ls * .dll -r | % versioninfo – tamasf

+4

Điều này sẽ chỉ mang lại FileVersion chứ không phải là AssemblyVersion – bitbonk

+0

Đối với dll được quản lý, để có được thông tin phiên bản thực/cập nhật, .NET thực sự là cách duy nhất để thực hiện. http://elegantcode.com/2009/12/22/powershell-load-assembly-without-locking-file/ Nhìn vào "cập nhật" xuống dưới đây, phần còn lại là quá phức tạp nó: p –

1

Dưới đây là một khá một liner: sản lượng

Get-ChildItem -Filter *.dll -Recurse | ForEach-Object ` 
{ 
    return [PSCustomObject]@{ 
     Name = $_.Name 
     FileVersion = $_.VersionInfo.FileVersion 
     AssemblyVersion = ([Reflection.AssemblyName]::GetAssemblyName($_.FullName).Version) 
    } 
} 

mẫu:

Name   FileVersion AssemblyVersion 
----   ----------- --------------- 
Minimatch.dll 1.1.0.0  1.1.0.0 
VstsTaskSdk.dll 1.0.0.0  1.0.0.0 
Các vấn đề liên quan