2010-07-16 20 views
31

Vorrei poter ottenere la versione del file e la versione di assembly di tutti i file DLL all'interno di una directory e di tutte le sue sottodirectory. Sono nuovo alla programmazione e non riesco a capire come far funzionare questo ciclo.Ottenere la versione del file e la versione di assembly dei file DLL nella directory corrente e tutte le sottodirectory

Ho questo codice PowerShell per ottenere la versione di assembly (preso da un forum):

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

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

E anche questo:

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

Come posso fare un ciclo di questo in modo che posso restituire la versione di assemblaggio di tutti i file all'interno di una directory?

risposta

26

Come un brutto one-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 

Se si desidera solo la directory corrente, poi, ovviamente, lasciare fuori il parametro -Recurse. Se si desidera tutti i file anziché solo le DLL, rimuovere il parametro -Filter e il relativo argomento. Il codice è (si spera) piuttosto semplice.

Ti suggerisco di eseguire il spin delle parti all'interno del blocco try in funzioni separate, poiché ciò renderà la gestione degli errori meno complessa qui.

uscita

Esempio:

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

Questo funziona, ma purtroppo carica i file e non li rilascia ... Esegui e quindi provare a cancella uno di quei file. –

+1

Questo è davvero un inconveniente. È possibile aggirare questo problema creando una nuova istanza di PowerShell: 'powershell -NoProfile -OutputFormat XML -EncodedCommand $ encodedCommand |% {$ _}' con '$ encodedCommand' è la variante codificata Base64 dello snippet sopra riportato (vedere' powershell /? 'per un esempio su come ottenerlo). Ciò produrrà gli stessi oggetti che altrimenti verrebbero prodotti, ma la shell che carica i file non è più attiva ora. – Joey

+0

Sto provando a caricare gli assembly in AppDomain nuovo e a scaricarlo in seguito, ma non funziona: il caricatore dell'assembly cerca gli assembly nella directory di PowerShell (C: /windows/system32/WindowsPowerShell/v1.0) anche se ho impostato il directory di base durante la creazione del nuovo dominio ... –

47

Ecco una bella uno di linea:

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

Insomma per PowerShell versione 2:

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

Insomma per PowerShell versione 3 come suggerito di tamasf:

ls *.dll -r | % versioninfo 
+6

In breve: ls * .dll -r | % versioninfo – tamasf

+4

Questo produrrà solo la VersioneVersione ma non la Versione Assembly – bitbonk

+0

Per le DLL gestite, per ottenere le informazioni sulla versione reale/aggiornata, .NET è davvero l'unica strada da percorrere. http://elegantcode.com/2009/12/22/powershell-load-assembly-without-locking-file/ Guarda l'"aggiornamento" in basso, il resto è troppo complicato: p –

1

Ecco un bel uno-liner: uscita

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

Esempio:

Name   FileVersion AssemblyVersion 
----   ----------- --------------- 
Minimatch.dll 1.1.0.0  1.1.0.0 
VstsTaskSdk.dll 1.0.0.0  1.0.0.0 
Problemi correlati