2010-07-16 22 views
31

Me gustaría poder obtener la versión de archivo y la versión de ensamblado de todos los archivos DLL dentro de un directorio y todos sus subdirectorios. Soy nuevo en la programación, y no puedo entender cómo hacer que funcione este bucle.Obtener versión de archivo y versión de ensamblado de archivos DLL en el directorio actual y todos los subdirectorios

que tienen el código de PowerShell para obtener la versión de ensamblado (tomado de un foro):

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

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

Y esto también:

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

¿Cómo puedo hacer un bucle de este modo que puedo devolver la versión ensamblada de todos los archivos dentro de un directorio?

Respuesta

26

Como un feo de una sola línea:

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 

Si sólo desea que el directorio actual, entonces, evidentemente, dejar de lado el parámetro -Recurse. Si desea todos los archivos en lugar de solo DLL, elimine el parámetro -Filter y su argumento. El código es (afortunadamente) bastante sencillo.

Sugeriría que escindir las partes desagradables dentro del bloque try en funciones separadas, ya que hará que el manejo de errores sea menos incómodo aquí.

salida

muestra:

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

Esto funciona, pero por desgracia, carga los archivos y no los libera ... Ejecutar y luego tratar de borre uno de esos archivos. –

+1

Eso es de hecho un inconveniente. Puede eludir esto al generar una nueva instancia de PowerShell: 'powershell -NoProfile -OutputFormat XML -EncodedCommand $ encodedCommand |% {$ _}' con '$ encodedCommand' que es la variante codificada en Base64 del fragmento anterior (consulte' powershell /? 'para una muestra de cómo obtenerlo). Esto producirá los mismos objetos que de otro modo se producirían, pero el shell que carga los archivos ya no está vivo. – Joey

+0

Estoy intentando cargar los ensamblados en el nuevo AppDomain y descargarlo más tarde, pero no funciona: el cargador de ensambles busca ensamblajes en el directorio de PowerShell (C: /windows/system32/WindowsPowerShell/v1.0) aunque configuré el directorio base al crear el nuevo dominio ... –

47

Aquí está una bastante un trazador de líneas:

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

En corto para PowerShell versión 2:

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

En corto para PowerShell versión 3 como se sugiere por tamasf:

ls *.dll -r | % versioninfo 
+6

En resumen: ls * .dll -r | % versioninfo – tamasf

+4

Esto solo arrojará FileVersion pero no AssemblyVersion – bitbonk

+0

Para dll administrados, para obtener información de la versión real/actualizada, .NET es realmente el único camino a seguir. http://elegantcode.com/2009/12/22/powershell-load-assembly-without-locking-file/ Mira la "actualización" abajo, el resto está complicando demasiado: p –

1

Aquí está un bonito de una sola línea: salida

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

muestra:

Name   FileVersion AssemblyVersion 
----   ----------- --------------- 
Minimatch.dll 1.1.0.0  1.1.0.0 
VstsTaskSdk.dll 1.0.0.0  1.0.0.0 
Cuestiones relacionadas