使用PowerShell来注册在GAC文件
-
21-08-2019 - |
题
有一种简单的方法来在PowerShell中(I想象利用的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
其他提示
如何让约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($_)}
我会建议调用函数的程序集添加到GAC东西以下的PowerShell准则喜欢添加-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
请注意,该分割字符串小命令来自 Pscx 。该功能是不是超级强大的(不支持通配符不检查怪异的类型,如日期时间),但至少它可以处理常规调用和管道调用。
你要替换的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
如果您创建个人资料的别名(只在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脚本将添加组件到GAC而不使用GACUTIL。 http://blog.goverco.com/2012 /04/use-powershell-to-put-your-assemblies.html
下载加载AssemblyToGlobalAssemblyCache.ps1后,您可以部署到GAC。
,用于将多个程序集Dir C:\MyWorkflowAssemblies | % {$_.Fullname} | .\Add-AssemblyToGlobalAssemblyCache.ps1
使用例
通过运行Get-Help .\Add-AssemblyToGlobalAssemblyCache.ps1 -Detailed
查看完整的文档
不希望在我需要把组件在GAC获得GACUTIL所有机器上安装Windows 8的SDK,我已经写了使用GAC API一个PowerShell模块。它适用于任何.NET版本。随着 PowerShell的GAC 你能做到像这样:
Get-Content ListOfAssemblies.txt | Add-GacAssembly