13

是否有一种简单的方法可以在 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
}
4

7 回答 7

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($_)}
于 2011-04-11T08:17:33.557 回答
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
于 2009-03-24T20:33:19.357 回答
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 cmdlet 来自Pscx。该函数不是超级健壮(没有通配符支持不会检查像 DateTime 这样的奇怪类型),但至少它可以处理常规调用和管道调用。

于 2009-03-25T03:40:03.590 回答
2

你想替换 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
于 2011-01-27T14:17:51.103 回答
1

如果您在配置文件中创建别名(只需在 ps 提示符下键入 $profile 以确定此文件位置),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。

希望这可以帮助。

于 2009-03-24T20:29:03.203 回答
1

此 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

于 2013-03-04T20:30:17.787 回答
0

不想在所有需要将程序集放入 GAC 以获取 gacutil 的机器上安装 Windows 8 SDK,我使用 GAC API 编写了一个 powershell 模块。它适用于任何 .Net 版本。使用PowerShell GAC,您可以这样做:

Get-Content ListOfAssemblies.txt | Add-GacAssembly 
于 2013-05-13T20:24:27.570 回答