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



我发现以下代码的工作方式有错误,这些代码摘自Archive 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

我添加了print语句,$Path和$Destination都有值;它们不是空的,也不是零。因为$args数组是空的,所以$key的值总是相同的,因此所有缓存文件都获得相同的名称,而不管解压缩的Zip归档文件是什么。然后,不同的输入会导致查阅同一个缓存文件,从而导致即使没有任何更改,也会重复解压缩同一个文件。

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

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

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

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

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

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

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

最新更新