Powershell을 사용하여 Gac에 파일 등록
-
21-08-2019 - |
문제
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
}
해결책
각 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
다른 팁
.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($_)}
Add-GacItem과 같은 PowerShell 지침에 따라 GAC에 어셈블리를 추가하는 함수를 호출하는 것이 좋습니다.또한 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 cmdlet의 출처는 다음과 같습니다. Pscx.이 함수는 매우 강력하지는 않지만(와일드카드 지원은 DateTime과 같은 이상한 유형을 확인하지 않음) 최소한 일반 호출과 파이프라인 호출을 처리할 수 있습니다.
gacutil.exe를 교체 하시겠습니까? 그렇지 않은 경우 Gacutil의 포함 /IL 스위치를 사용하지 않는 이유는 무엇입니까?
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
프로필에 별명을 만드는 경우 (이 파일 위치를 결정하기 위해 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이라고합니다.
도움이 되었기를 바랍니다.
이 PowerShell 스크립트는 Gacutil을 사용하지 않고 GAC에 어셈블리를 추가합니다. 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
GACIL을 얻기 위해 GAC에 어셈블리를 넣는 데 필요한 모든 기계에 Windows 8 SDK를 설치하고 싶지 않기 때문에 GAC API를 사용하여 PowerShell 모듈을 작성했습니다. 모든 .NET 버전과 함께 작동합니다. 와 함께 PowerShell Gac 당신은 그렇게 할 수 있습니다 :
Get-Content ListOfAssemblies.txt | Add-GacAssembly