2009-03-24 32 views
12

Có cách nào đơn giản để trong PowerShell (tôi tưởng tượng sử dụng gacutil.exe) để đọc từ tài liệu văn bản một đường dẫn \ assembly và đăng ký nó trong GAC không? Vì vậy, ví dụ như một tập tin .txt trông giống như:Sử dụng Powershell để đăng ký một tệp trong Gac

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

Các kịch bản PowerShell sẽ đọc đó vào một dòng suối và sau đó chạy gacutil trên mỗi những hội tìm thấy? Tôi đoán nó sẽ là một cái gì đó như:

#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

Vì vậy, đây là câu hỏi hoặc tuyên bố? Bạn đã chạy nó? Nó có hoạt động không? Có vấn đề gì thế? Tôi có thể nói với bạn rằng nó sẽ không chạy như được viết. – EBGreen

+0

Thư viện này sẽ giúp rất nhiều: https://powershellgac.codeplex.com/ –

Trả lời

5

Nếu bạn sắp xếp ra tập tin văn bản của bạn như vậy mà mỗi dll là trên một dòng riêng biệt, bạn có thể sử dụng lệnh Get-Content và ống mỗi một bộ lọc đó đã lệnh của bạn:

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 nó đã có nghĩa là để được trên một sep. dòng nhưng dường như nó đã được đặt lại với nhau trên trang web..cho tôi thử này –

+1

awesome..worked như một say mê. FYI cho bất cứ ai mà cần biết trong trường hợp bạn muốn gac một 2.0 lắp ráp bạn cần phải trỏ đến gacutil.exe cho .NET 2.0. –

+0

Bạn cũng có thể cải thiện điều này bằng cách tạo bí danh cho gacutil, điều này sẽ giúp bạn dễ dàng thay đổi phiên bản bạn đang nhắm mục tiêu và làm cho bộ lọc dễ đọc hơn. – Charlie

1

Nếu bạn tạo một bí danh trong hồ sơ của bạn (chỉ cần gõ $ hồ sơ tại dấu nhắc ps để xác định vị trí tập tin này) như vậy new-alias "gac" ($env:ProgramFiles+"\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe") sau đó bạn có thể sử dụng gấc như vậy:

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

phần cuối cùng là quan trọng nhất. nó gọi gacutil bằng các công tắc mà bạn muốn.

Hy vọng điều này sẽ hữu ích.

3

tôi sẽ đề nghị gọi hàm để thêm một assembly vào GAC một cái gì đó theo hướng dẫn PowerShell như Add-GacItem. Ngoài ra vị trí của gacutil.exe khác nhau dựa trên hệ thống của bạn. Nếu bạn đã cài đặt VS 2008, nó phải ở vị trí hiển thị bên dưới.

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 

Lưu ý rằng lệnh ghép ngắn chuỗi phân tách đến từ Pscx. Hàm này không phải là siêu mạnh (không hỗ trợ ký tự đại diện không kiểm tra các kiểu lạ như DateTime) nhưng ít nhất nó có thể xử lý lời gọi thường xuyên và lời gọi đường dẫn.

2

Bạn có muốn thay thế gacutil.exe không? Nếu không, tại sao không sử dụng chuyển đổi bao gồm/il của gacutil?

Từ 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

Làm thế nào về chúng ta hãy lo lắng về 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($_)} 
+1

Tìm thấy ý tưởng liên quan này: http://weblogs.asp.net/adweigert/archive/2008/10/31/powershell-install-gac-gacutil-for-powershell.aspx –

+0

Nội dung thú vị, cảm ơn –

1

Tập lệnh PowerShell này sẽ thêm cụm vào GAC mà không sử dụng GacUtil. http://blog.goverco.com/2012/04/use-powershell-to-put-your-assemblies.html

Sau downloading Add-AssemblyToGlobalAssemblyCache.ps1 bạn có thể triển khai lên gac.

Cách sử dụng ví dụ cho thêm nhiều cụm Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1

Xem tài liệu đầy đủ bằng cách chạy Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed

+0

Vui lòng không chỉ liên kết đến mã, cung cấp mã trong câu trả lời. –

+0

Cảm ơn @Kolink, tôi đã cập nhật câu trả lời với nhiều chi tiết hơn. –

0

Không muốn cài đặt SDK Windows 8 trên tất cả các máy tôi cần phải đặt lắp ráp trong GAC để có được gacutil, tôi đã viết một mô-đun PowerShell sử dụng API GAC. Nó hoạt động với mọi phiên bản .Net. Với PowerShell GAC bạn có thể làm như vậy:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
Các vấn đề liên quan