2009-03-24 12 views
12

Czy istnieje prosty sposób w PowerShell (wyobrażam sobie, używając gacutil.exe) do odczytu z dokumentu tekstowego ścieżki \ montażu i zarejestrowania go w GAC? Tak na przykład .txt plik, który wygląda następująco:Używanie Powershell do zarejestrowania pliku w Gac

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

skrypt PowerShell by przeczytać, że do strumienia, a następnie uruchomić gacutil na każdym z tych zespołów znalazł? Myślę, że będzie to coś jak:

#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

Czy to pytanie lub oświadczenie? Czy to uruchomiłeś? Zadziałało? W czym problem? Mogę powiedzieć, że nie będzie działać tak, jak napisano. – EBGreen

+0

Ta biblioteka bardzo pomaga: https://powershellgac.codeplex.com/ –

Odpowiedz

5

Jeśli uporządkować pliku tekstowego, tak że każdy dll jest w osobnej linii, można użyć Get-Content polecenie i rurę każdy z filtrem, który zrobił swoją komendę:

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 to miało być na oddzielnym. linii, ale wydaje się, że został złożony na stronie .. wypróbuj to –

+1

niesamowite .. pracował jak urok. FYI dla każdego, kto musi wiedzieć, w przypadku, gdy chcesz zgrać zestaw 2.0, musisz wskazać na gacutil.exe dla .NET 2.0. –

+0

Można to również poprawić, tworząc alias dla gacutil, który ułatwiłby zmianę wersji, którą kierujesz, i uczyni filtr bardziej czytelnym. – Charlie

1

Jeśli utworzyć alias w swoim profilu (wystarczy wpisać $ profile w wierszu ps aby określić tę lokalizację pliku) jak tak new-alias "gac" ($env:ProgramFiles+"\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe") następnie można użyć GAC tak:

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

ostatnia część jest najważniejsza. to wywołuje gacutil z przełącznikami, które chcesz.

Mam nadzieję, że to pomoże.

3

bym sugeruje wywołanie funkcji dodawania złożenia do GAC coś po wytycznych PowerShell, takich jak Add-GacItem. Również lokalizacja pliku gacutil.exe zależy od systemu. Jeśli masz zainstalowany VS 2008, powinien on znajdować się w miejscu pokazanym poniżej.

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 

Zauważ, że cmdlet Split-String pochodzi z Pscx. Ta funkcja nie jest super wydajna (nie obsługuje symboli wieloznacznych, nie sprawdza dziwnych typów, takich jak DateTime), ale przynajmniej może obsłużyć zwykłe wywołanie i wywołanie potoku.

2

Czy chcesz zastąpić gacutil.exe? Jeśli nie, to dlaczego nie użyć przełącznika gacutil włączone/il?

Z 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

Jak o niech .NET martwić 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

Znaleźliśmy ten powiązany pomysł: http://weblogs.asp.net/adweigert/archive/2008/10/31/powershell-install-gac-gacutil-for-powershell.aspx –

+0

Fajne rzeczy, dziękuję –

1

Ten skrypt PowerShell doda zespoły do ​​GAC bez użycia GacUtil. http://blog.goverco.com/2012/04/use-powershell-to-put-your-assemblies.html

Po downloading można dodać plik Add-AssemblyToGlobalAssemblyCache.ps1 do gac.

Przykład użycia przez dodanie wielu zespołów Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1

Zobacz pełną dokumentację uruchamiając Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed

+0

Proszę nie tylko link do kodu, podaj kod w odpowiedzi. –

+0

Dzięki @Kolink, zaktualizowałem odpowiedź bardziej szczegółowo. –

0

Nie chcąc zainstalować Windows 8 SDK na wszystkich maszynach, co potrzebne, aby umieścić zespoły w GAC dostać gacutil, ja Napisałem moduł powershell za pomocą interfejsu API GAC. Działa z każdą wersją .Net. Z PowerShell GAC możesz to zrobić tak:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
Powiązane problemy