Pergunta

Existe uma maneira simples no PowerShell (imagino usando gacutil.exe) para ler a partir de um documento de texto um caminho \ assembly e registrá-lo no GAC? Assim, por exemplo, um arquivo .txt que se parece com:

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

O script PowerShell iria ler isso em um córrego e gacutil em seguida, executar em cada um desses conjuntos encontrado? Eu acho que seria 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
}
Foi útil?

Solução

Se você resolver o seu arquivo de texto de modo que a cada dll está em uma linha separada, você poderia usar o comando Get-Content e tubo de cada um para um filtro que fez o seu comando:

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

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

Outras dicas

Que tal deixar a preocupação .Net sobre 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($_)}

Eu sugeriria chamar a função para adicionar uma assembléia para a algo GAC seguindo orientações do PowerShell como Add-GacItem. Também a localização do gacutil.exe varia de acordo com o seu sistema. Se você tiver VS 2008 instalado, ele deve estar no local mostrado abaixo.

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

Note que o cmdlet Split-Cordas vem Pscx . A função não é super robusto (sem apoio de curinga não verifica os tipos estranhos como DateTime) mas pelo menos ele pode lidar com regular, invocação e gasoduto invocação.

Você deseja substituir gacutil.exe? Se não, por que não usar incluído interruptor de gacutil / il?

Desde o 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

Se você criar um alias no seu perfil (basta digitar $ perfil em um prompt de ps para determinar este local arquivo) como assim new-alias "gac" ($env:ProgramFiles+"\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe") então você pode usar gac assim:

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

A última parte é a mais importante. que chama gacutil com a muda que quiser.

Espero que isso ajude.

Este script PowerShell irá adicionar montagens ao GAC sem usar GacUtil. http://blog.goverco.com/2012 /04/use-powershell-to-put-your-assemblies.html

Depois de download o Add-AssemblyToGlobalAssemblyCache.ps1 você pode implantar para o GAC.

Exemplo de utilização para a adição de vários conjuntos Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1

Consulte a documentação completa, executando Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed

Não querendo instalar o Windows 8 SDK em todas as máquinas que eu precisava para colocar os conjuntos no GAC para obter gacutil, eu escrevi um módulo PowerShell usando a API do GAC. Ele funciona com qualquer versão .NET. Com PowerShell GAC você pode fazê-lo assim:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top