2009-03-24 4 views
12

Есть ли простой способ в PowerShell (я полагаю, используя gacutil.exe) прочитать из текстового документа путь \ сборку и зарегистрировать его в GAC? Так, например, .txt файл, который выглядит следующим образом:Использование Powershell для регистрации файла в Gac

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

Скрипт PowerShell прочтет, что в поток, а затем запустить gacutil на каждом из этих сборок нашли? Я предполагаю, что это будет что-то вроде:

#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

Так что это вопрос или утверждение? Вы запустили это? Это сработало? В чем была проблема? Я могу сказать, что он не будет работать так, как написано. – EBGreen

+0

Эта библиотека помогает много: https://powershellgac.codeplex.com/ –

ответ

5

Если разобраться текстовый файл таким образом, что каждый DLL находится на отдельной строке, вы можете использовать команду Get-Content и трубку каждый фильтр, который сделал вашу команду:

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 это должно было быть на sep. но кажется, что он собрался вместе на сайте .. я попробую это – 2009-03-24 20:47:45

+1

awesome..worked как шарм. FYI для тех, кому нужно знать, если вы хотите собрать сборку 2.0, вам нужно указать на gacutil.exe для .NET 2.0. – 2009-03-24 20:59:36

+0

Вы также можете улучшить это, создав псевдоним для gacutil, который упростит изменение версии, на которую вы нацеливаетесь, и сделайте фильтр более удобочитаемым. – Charlie

1

Если создать псевдоним в вашем профиле (просто наберите $ профиль на пс строке, чтобы определить это местоположение файла), как так new-alias "gac" ($env:ProgramFiles+"\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe"), то вы можете использовать GAC так:

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

Последняя часть является самой важной. он вызывает gacutil с помощью переключателей, которые вы хотите.

Надеюсь, это поможет.

3

Я бы предложите вызвать функцию, чтобы добавить сборку к GAC, следуя инструкциям PowerShell, таким как Add-GacItem. Также местоположение gacutil.exe зависит от вашей системы. Если у вас установлен VS 2008, он должен находиться в указанном ниже месте.

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 

Обратите внимание, что Split-струнной Командлет происходит от Pscx. Функция не является супер надежной (поддержка подстановочных знаков не проверяет такие странные типы, как DateTime), но по крайней мере она может обрабатывать регулярные вызовы и вызов конвейера.

2

Вы хотите заменить gacutil.exe? Если нет, то почему бы не использовать включенный/il переключатель gacutil?

С gacutil/ч:

/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

Как насчет позволить .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

Нашел эту связанную идею: http://weblogs.asp.net/adweigert/archive/2008/10/31/powershell-install-gac-gacutil-for-powershell.aspx –

+0

Прохладный материал, спасибо –

1

Этот сценарий PowerShell добавит сборки в GAC без использования GacUtil. http://blog.goverco.com/2012/04/use-powershell-to-put-your-assemblies.html

После downloading Add-AssemblyToGlobalAssemblyCache.ps1 вы можете установить в gac.

Пример использования для добавления нескольких сборок Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1

Смотрите полную документацию, запустив Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed

+0

Пожалуйста, не просто ссылку на код, укажите код в ответе. –

+0

Спасибо @Kolink, я уточнил ответ более подробно. –

0

Не желая установить SDK для Windows 8 на всех машинах, мне нужно, чтобы положить сборки в GAC, чтобы получить gacutil, я Я написал модуль powershell с использованием API GAC. Он работает с любой версией .Net. С PowerShell GAC вы можете сделать это так:

Get-Content ListOfAssemblies.txt | Add-GacAssembly