在Invoke-expression Call中获取错误

时间:2013-05-31 06:42:21

标签: powershell

我的要求是在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;
    }

}

这给出了一个错误:将程序集添加到缓存失败:文件名,目录名或卷标语法不正确。很多,无法修复它。 请帮助:)

1 个答案:

答案 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"