Использование Powershell для регистрации файла в Gac
Есть ли простой способ в PowerShell (я полагаю, используя gacutil.exe) читать из текстового документа путь\сборку и зарегистрировать его в GAC? Например, файл .txt выглядит так:
c:\test\myfile.dll
c:\myfile2.dll
d:\gac\gacthisfile.dll
PowerShell script читает это в поток, а затем запускает 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
Если вы отсортируете свой текстовый файл так, чтобы каждая 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
Ответ 2
Как насчет того, чтобы .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($_)}
Ответ 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-String происходит из Pscx. Функция не является супер надежной (поддержка подстановочных знаков не проверяет такие странные типы, как DateTime), но, по крайней мере, она может обрабатывать регулярные вызовы и вызов конвейера.
Ответ 4
Вы хотите заменить gacutil.exe? Если нет, почему бы не использовать gacutil included/il switch?
Из 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
Ответ 5
Если вы создаете псевдоним в своем профиле (просто введите $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 с помощью переключателей, которые вы хотите.
Надеюсь, что это поможет.
Ответ 6
Этот PowerShell script добавит сборки в 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
Ответ 7
Не желая устанавливать SDK Windows 8 на всех машинах, мне нужно было собрать сборки в GAC для получения gacutil, я написал модуль powershell с использованием API GAC. Он работает с любой версией .Net. С PowerShell GAC вы можете сделать это так:
Get-Content ListOfAssemblies.txt | Add-GacAssembly