2009-03-24 44 views
12

¿Hay una manera simple de en PowerShell (me imagino usando gacutil.exe) leer un documento de texto de una ruta de acceso/ensamblaje y registrarlo en el GAC? Así, por ejemplo, un archivo .txt que se parece a:Uso de Powershell para registrar un archivo en el Gac

c:\test\myfile.dll 
c:\myfile2.dll 
d:\gac\gacthisfile.dll 

El script de PowerShell que se leería en una corriente y vuelva a ejecutar gacutil en cada uno de esos montajes encontrado? Supongo que sería algo así como:

#read files into array? 

foreach ($file in Get-ChildItem -Filter "*.dll") 
{ 
    Write-Host $file.Name 
    C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe /nologo /i $file.Name 
} 
+1

¿Entonces esta es una pregunta o un declaración? ¿Corriste eso? ¿Funcionó? ¿Cual fue el problema? Puedo decirte que no se ejecutará como está escrito. – EBGreen

+0

Esta biblioteca ayuda mucho: https://powershellgac.codeplex.com/ –

Respuesta

5

Si ordena a cabo su archivo de texto de forma que la cada DLL está en una línea separada, se puede utilizar el comando Get-Content y el tubo cada uno a un filtro que hizo su comando:

filter gac-item { C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe /nologo /i $_} 

get-content fileOfDlls.txt | ?{$_ -like "*.dll"} | gac-item 
+0

ahh estaba destinado a estar en un sep. línea, pero parece que se puso juntos en el sitio ... déjame intentar este –

+1

impresionante ... trabajado como un encanto. Para su información, para cualquier persona que necesite saber en caso de que quiera obtener un ensamblado 2.0, debe señalar el archivo gacutil.exe para .NET 2.0. –

+0

También podría mejorar esto mediante la creación de un alias para gacutil, lo que facilitaría el cambio de la versión a la que apunta y haría que el filtro sea más legible. – Charlie

1

Si crea un alias en su perfil (sólo tiene que escribir $ perfil en un símbolo del PS para determinar esta ubicación del archivo) al igual que new-alias "gac" ($env:ProgramFiles+"\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe") entonces puede utilizar GAC así:

get-childitem $basedirectory "*$filter.dll" | foreach-object -process{ WRITE-HOST -FOREGROUND GREEN "Processing $_"; gac /i $_.FullName /f} 

la última parte es la más importante. llama a gacutil con los interruptores que quieras.

Espero que esto ayude.

3

lo haría sugerir llamar a la función para agregar un ensamblado al GAC, algo que sigue las pautas de PowerShell como Add-GacItem. La ubicación de gacutil.exe también varía en función del sistema. Si tiene VS 2008 instalado, debe estar en la ubicación que se muestra a continuación.

function Add-GacItem([string]$path) { 
    Begin { 
    $gacutil="$env:ProgramFiles\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" 

    function AddGacItemImpl([string]$path) { 
     "& $gacutil /nologo /i $path" 
    } 
    } 
    Process { 
    if ($_) { AddGacItemImpl $_ } 
    } 
    End { 
    if ($path) { AddGacItemImpl $path } 
    } 
} 

Get-Content .\dlls.txt | Split-String | Add-GacItem 

Tenga en cuenta que el cmdlet Split-Cadena proviene de Pscx. La función no es súper robusta (ningún comodín no comprueba tipos raros como DateTime) pero al menos puede manejar la invocación regular y la invocación de canalización.

2

¿Desea reemplazar gacutil.exe? De lo contrario, ¿por qué no utilizar el modificador/il incluido de gacutil?

Desde el gacutil/h:

/il <assembly_path_list_file> [ /r <...> ] [ /f ] 
    Installs one or more assemblies to the global assembly cache. 
    <assembly_list_file> is the path to a text file that contains a list of 
    assembly manifest file paths. Individual paths in the text file must be 
    separated by CR/LF. 
    Example: /il MyAssemblyList.txt /r FILEPATH c:\projects\myapp.exe "My App" 
    myAssemblyList.txt content: 
    myAsm1.dll 
    myAsm2.dll 
24

¿Qué tal dejar que la preocupación sobre .Net gacutil?

# load System.EnterpriseServices assembly 
[Reflection.Assembly]::LoadWithPartialName("System.EnterpriseServices") > $null 

# create an instance of publish class 
[System.EnterpriseServices.Internal.Publish] $publish = new-object System.EnterpriseServices.Internal.Publish 

# load and add to gac :) 
get-content fileOfDlls.txt | ?{$_ -like "*.dll"} | Foreach-Object {$publish.GacInstall($_)} 
+1

Encontré esta idea relacionada: http://weblogs.asp.net/adweigert/archive/2008/10/31/powershell-install-gac-gacutil-for-powershell.aspx –

+0

Cosas interesantes, gracias –

1

Este script de PowerShell agregará ensamblajes al GAC sin usar GacUtil. http://blog.goverco.com/2012/04/use-powershell-to-put-your-assemblies.html

Después de downloading Add-AssemblyToGlobalAssemblyCache.ps1 puede implementar en el gac.

Ejemplo de uso para añadir varios ensamblados Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1

Consulte la documentación completa mediante la ejecución de Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed

+0

Por favor no solo enlace al código, proporcione el código en la respuesta. –

+0

Gracias @Kolink, he actualizado la respuesta con más detalles. –

0

No queriendo instalar el SDK de Windows 8 en todas las máquinas que necesitaba para poner ensamblados en la GAC ​​para obtener gacutil, me He escrito un módulo powershell usando la API de GAC. Funciona con cualquier versión de .Net. Con PowerShell GAC puede hacerlo así:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
Cuestiones relacionadas