为什么调用此函数时 $args 数组为空?
Why is $args array empty when this function is called?
我发现以下代码的工作方式存在错误,摘自 MSFT_Archive.psm1,Archive 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
我添加了打印语句并且 $Path 和 $Destination 有值;他们不是空的或零。因为 $args 数组是空的,$key 的值总是相同的,因此所有缓存文件都具有相同的名称,而不管 Zip 存档被解压。然后,不同的输入会导致查询相同的缓存文件,从而导致即使没有任何更改,也会重复解压缩相同的文件。
该方法没有命名参数,因此 $args 应始终包含未绑定参数列表。怎么了?
我在带有 DSC Resource Kit Wave 10 的 Windows Server 2008R2 系统上使用 Powershell 4.0。
更新:Archive 和 xArchive 资源都存在这个问题。
如您所见,只有 [string]::Join($args)
的函数将产生空结果。正如 解释的那样,您需要在方法中至少有 2 个参数(取决于您使用的重载)。作为替代方案,您可以尝试使用 -join
运算符。
$key = (-join $args).GetHashCode().ToString()
[string]::Join() 没有单个参数重载。试试这个:
$key = [string]::Join('', $args).GetHashCode().ToString()
我发现以下代码的工作方式存在错误,摘自 MSFT_Archive.psm1,Archive 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
我添加了打印语句并且 $Path 和 $Destination 有值;他们不是空的或零。因为 $args 数组是空的,$key 的值总是相同的,因此所有缓存文件都具有相同的名称,而不管 Zip 存档被解压。然后,不同的输入会导致查询相同的缓存文件,从而导致即使没有任何更改,也会重复解压缩相同的文件。
该方法没有命名参数,因此 $args 应始终包含未绑定参数列表。怎么了?
我在带有 DSC Resource Kit Wave 10 的 Windows Server 2008R2 系统上使用 Powershell 4.0。
更新:Archive 和 xArchive 资源都存在这个问题。
如您所见,只有 [string]::Join($args)
的函数将产生空结果。正如 -join
运算符。
$key = (-join $args).GetHashCode().ToString()
[string]::Join() 没有单个参数重载。试试这个:
$key = [string]::Join('', $args).GetHashCode().ToString()