문제

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 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top