Pregunta

¿Existe una forma sencilla de leer en PowerShell (me imagino usando gacutil.exe) de un documento de texto una ruta\ensamblaje y registrarlo en el GAC?Entonces, por ejemplo, un archivo .txt que se ve así:

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

¿El script de PowerShell lo leería en una secuencia y luego ejecutaría gacutil en cada uno de los ensamblados encontrados?Supongo que sería algo 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
}
¿Fue útil?

Solución

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

Otros consejos

¿Qué hay de 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($_)}

Yo sugeriría llamando a la función para añadir una asamblea para el GAC algo siguientes directrices PowerShell como complemento GacItem. Además, la ubicación de gacutil.exe varía en función de su sistema. Si tiene instalado VS 2008, debe estar en el lugar que se indica 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 muy robusta (sin el soporte de comodines no comprueba los tipos extraños como DateTime) pero al menos se puede manejar regular de la invocación y la tubería de invocación.

¿Quieres reemplazar gacutil.exe? Si no es así, ¿por qué no usar el interruptor / 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

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. que llama gacutil con los interruptores que desea.

Espero que esto ayude.

Este script PowerShell añadirá ensamblados al GAC sin utilizar gacutil. http://blog.goverco.com/2012 /04/use-powershell-to-put-your-assemblies.html

descargar el complemento AssemblyToGlobalAssemblyCache.ps1 se puede implementar en la GAC.

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

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

Como no quería instalar el SDK de Windows 8 en todas las máquinas, necesitaba colocar ensamblajes en el GAC para obtener gacutil, escribí un módulo de PowerShell usando la API de GAC.Funciona con cualquier versión de .Net.Con PowerShell-GAC puedes hacerlo así:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top