我发现以下代码的工作方式错误,摘自存档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/