我的要求是在GAC中注册dll,我正在使用gacutil。我写的内容如下。
function RegisterAssembliesToGAC([string]$frameworkPath,[string]$GACDllLocation)
{
try
{
$Dirs = Get-ChildItem $GACDllLocation -Recurse
$Dlls = $Dirs | Where { $_.extension -eq ".dll" }
ForEach($dll in $Dlls)
{
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\gacutil.exe -i $dll.FullName
}
}
catch [Exception]
{
write-host $_.Exception.Message `n;
}
}
这对我来说很好。现在我显示$ frameworkpath是一个参数,我想将其值作为参数传递。所以我修改了我的代码如下
function RegisterAssembliesToGAC([string]$frameworkPath,[string]$GACDllLocation)
{
try
{
$Dirs = Get-ChildItem $GACDllLocation -Recurse
$Dlls = $Dirs | Where { $_.extension -eq ".dll" }
ForEach($dll in $Dlls)
{
$frameworkPath="C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
$gacpath=[string]$frameworkPath + "\gacutil.exe"
Invoke-Expression "$gacpath -i $dll.FullName"
}
}
catch [Exception]
{
write-host $_.Exception.Message `n;
}
}
这给出了一个错误:将程序集添加到缓存失败:文件名,目录名或卷标语法不正确。很多,无法修复它。 请帮助:)
答案 0 :(得分:1)
首先:
如果在脚本中总是给它一个值,那么 $frameworkPath
参数是没有意义的:
$frameworkPath="C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
第二:你需要做出这样的改变:
Invoke-Expression "$gacpath -i $($dll.FullName)"
因为在字符串中,变量参数扩展需要包含在$()
中。
如果您在iex
这个"$gacpath -i $dll.FullName"
之前添加的脚本中,您可以看到如何评估。
第三:我建议使用join-path cmdlet构建路径:
$gacpath= join-path $frameworkPath "gacutil.exe"