Domanda

Esiste un modo semplice per in PowerShell (immagino di utilizzare gacutil.exe) per leggere da un documento di testo un percorso\assembly e registrarlo nel GAC?Quindi, ad esempio, un file .txt che assomiglia a:

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

Lo script PowerShell lo leggerebbe in un flusso e quindi eseguirebbe gacutil su ciascuno degli assembly trovati?Immagino che sarebbe qualcosa del tipo:

#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
}
È stato utile?

Soluzione

Se si ordina il vostro file di testo in modo tale che l'ogni DLL è su una riga separata, è possibile utilizzare il comando Get-Content e tubo ciascuna ad un filtro che ha fatto il vostro comando:

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

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

Altri suggerimenti

Che ne dite di lasciare che la preoccupazione circa 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($_)}

Vorrei suggerire di chiamare la funzione per aggiungere un assembly al GAC qualcosa seguenti linee guida PowerShell piace Add-GacItem. Anche la posizione di gacutil.exe varia in base al vostro sistema. Se si dispone di VS 2008 installato, dovrebbe essere nella posizione indicata di seguito.

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

Si noti che il cmdlet Split-String viene da Pscx . La funzione non è super robusto (nessun supporto dei caratteri jolly non verifica per i tipi strani come DateTime), ma almeno si può gestire regolare invocazione e pipeline di invocazione.

Vuoi sostituire gacutil.exe? Se no, perché non usare l'interruttore incluso / IL di gacutil?

Dal 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 si crea un alias nel tuo profilo (basta digitare $ profile al prompt ps per determinare questa posizione del file) in questo modo new-alias "gac" ($env:ProgramFiles+"\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe") allora si può utilizzare GAC in questo modo:

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

l'ultima parte è la più importante. chiama gacutil con gli interruttori che si desidera.

Spero che questo aiuti.

Questo script PowerShell aggiungerà assembly al GAC senza utilizzare GacUtil. http://blog.goverco.com/2012 /04/use-powershell-to-put-your-assemblies.html

scaricando l'Add-AssemblyToGlobalAssemblyCache.ps1 È possibile distribuire al GAC.

Esempio di utilizzo per aggiungere più assembly Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1

Vedere la documentazione completa eseguendo Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed

Non volendo installare l'SDK di Windows 8 su tutte le macchine di cui avevo bisogno per inserire assembly nel GAC per ottenere gacutil, ho scritto un modulo PowerShell utilizzando l'API GAC.Funziona con qualsiasi versione .Net.Con GAC di PowerShell puoi farlo in questo modo:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top