Использование Powershell для регистрации файла в Gac - PullRequest
13 голосов
/ 24 марта 2009

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

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
}

Ответы [ 7 ]

24 голосов
/ 11 апреля 2011

Как насчет того, чтобы .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($_)}
5 голосов
/ 24 марта 2009

Если вы отсортируете свой текстовый файл так, чтобы каждая 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
3 голосов
/ 25 марта 2009

Я бы предложил вызвать функцию, чтобы добавить сборку в 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-String имеет значение Pscx . Функция не является сверхнадежной (никакая поддержка подстановочных знаков не проверяет странные типы, такие как DateTime), но, по крайней мере, она может обрабатывать регулярные вызовы и вызовы конвейера.

2 голосов
/ 27 января 2011

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

Из 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
1 голос
/ 05 марта 2013

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

После загрузки Add-AssemblyToGlobalAssemblyCache.ps1, которую вы можете развернуть в gac.

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

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

1 голос
/ 24 марта 2009

Если вы создаете псевдоним в своем профиле (просто введите $ profile в приглашении ps, чтобы определить местоположение этого файла) примерно так 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 с нужными вам переключателями.

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

0 голосов
/ 14 мая 2013

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

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
...