Utilizzo di Powershell per registrare un file nel file Gac
-
21-08-2019 - |
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
}
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