为什么$ args数组在调用此函数时为空?

时间:2015-04-20 20:44:36

标签: arrays powershell dsc

我发现以下代码的工作原理出错,摘自MSFT_Archive.psm1,归档DSC资源。

Function Get-CacheEntry
{
    $key = [string]::Join($args).GetHashCode().ToString()
    Trace-Message "Using ($key) to retrieve hash value"
    $path = Join-Path $CacheLocation $key
    if(-not (Test-Path $path))
    {
        Trace-Message "No cache value found"
        return @{}
    }
    else
    {
        $tmp = Import-CliXml $path
        Trace-Message "Cache value found, returning $tmp"
        return $tmp
    }
}

行" $ key = [string] :: Join($ args)。GetHashCode()。ToString()"做错了,因为$ args总是作为一个空数组出来。对此方法的典型调用是:

$cacheObj = Get-CacheEntry $Path $Destination

我添加了print语句,$ Path和$ Destination有值;他们不是空的或没有。因为$ args数组为空,所以$ key的值始终相同,因此所有缓存文件都具有相同的名称,无论Zip存档是否已解压缩。然后,不同的输入会导致查询相同的缓存文件,导致同一文件被重复解压缩,即使没有任何变化。

该方法没有命名参数,因此$ args应始终具有未绑定参数列表。有什么问题?

我在带有DSC Resource Kit Wave 10的Windows Server 2008R2系统上使用Powershell 4.0。

更新:Archive和xArchive资源中都存在此问题。

2 个答案:

答案 0 :(得分:2)

如您所见,只有[string]::Join($args)的函数会产生空结果。正如EBGreen解释的那样,你需要在方法中至少有2个参数(取决于你使用的重载)。作为替代方案,您可以尝试使用-join运算符。

$key = (-join $args).GetHashCode().ToString()

答案 1 :(得分:2)

[string] :: Join()没有单个参数重载。试试这个:

$key = [string]::Join('', $args).GetHashCode().ToString()