我发现以下代码的工作方式错误,摘自存档DSC资源MSFT_Archive.psm1。

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

我添加了打印语句,并且$ Path和$ Destination具有值;它们不为空或为零。由于$ args数组为空,因此$ key的值始终相同,因此,无论是否解压缩Zip存档,所有缓存文件都具有相同的名称。然后,不同的输入将导致查询相同的缓存文件,即使没有任何更改,也将反复解压缩同一文件。

该方法没有命名参数,因此$ args应该始终具有未绑定(bind)参数的列表。怎么了?

我正在Windows Server 2008R2系统和DSC Resource Kit Wave 10上使用Powershell 4.0。

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

最佳答案

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

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

关于arrays - 为什么调用此函数时$ args数组为空?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29758037/

10-17 02:18