首页 > 解决方案 > 无法索引到空数组,但是没有数组,它是一个哈希表,并且哈希表不为空

问题描述

我有以下代码,它不仅仅是功能最低的,但我希望它仍然可以理解。

$data = 'PATH TO SOME FILE OR FOLDER'
$rule = @{
    property = 'size'
    operator = 'lt'
    value = '1000gb'
    note = $null
    logOnForgo = $false
}
$ruleOperationArguments = @{
    operator = $rule.operator
    operand1 = $Null # always the current state to be tested, and depends on specific rule
    logString1 = $rule.property
    operand2 = $rule.value
    logString2 = $rule.value # sometimes modified by rule
    note = $rule.note
    logOnForgo = $rule.logOnForgo
}

if (($item = Get-Item $data).PSIsContainer) {
    $actualSize = 0
    foreach ($childItem in (Get-ChildItem $item -recurse | Where {-not $_.PSIsContainer} | ForEach-Object {$_.FullName})) {
        $actualSize += (Get-Item $childItem).length
    }
} else {
    $actualSize = $item.length
}
$ruleOperationArguments.operand1 = $actualSize
if ($actualSize -gt 1TB) {
    $actualSizeString = "$([math]::Round(($actualSize/1TB),2))TB"
} elseif ($actualSize -gt 1GB) {
    $actualSizeString = "$([math]::Round(($actualSize/1GB),2))GB"
} elseif ($actualSize -gt 1mb) {
    $actualSizeString = "$([math]::Round(($actualSize/1MB),2))MB"
} elseif ($actualSize -gt 1kb) {
    $actualSizeString = "$([math]::Round(($actualSize/1KB),2))KB"
} else {
    $actualSizeString = "$([math]::Round(($actualSize),2))Bytes"
}
$ruleOperationArguments.logString1 = "$($ruleOperationArguments.logString1) ($actualSizeString)"

# test size
switch ($interval[0].Groups['unit'].Value) {
    kb {$ruleOperationArguments.operand2 = [System.Int64]($interval[0].Groups['number'].Value) * 1kb}
    mb {$ruleOperationArguments.operand2 = [System.Int64]($interval[0].Groups['number'].Value) * 1mb}
    gb {$ruleOperationArguments.operand2 = [System.Int64]($interval[0].Groups['number'].Value) * 1gb}
    tb {$ruleOperationArguments.operand2 = [System.Int64]($interval[0].Groups['number'].Value) * 1tb}
}

$ruleOperationArguments

我收到一个非常奇怪的错误

无法索引到空数组。在行:39 字符:41

那条线是

$ruleOperationArguments.logString1 = "$($ruleOperationArguments.logString1) ($actualSizeString)"

但这是奇怪的事情。代码有效。$ruleOperationArguments.logString1IS的实际最终值已更新以包含实际尺寸数据。

我还尝试不通过附加到自身来修改哈希表值,而是使用相同的结果。

$ruleOperationArguments.logString1 = "$($rule.property) ($actualSizeString)"

它实际上与放入哈希表的数据无关,因为

$ruleOperationArguments.logString1 = "WTAF?"

也会抛出错误。导致问题的 logStrings 有什么不同,而操作数工作没有问题?我什至尝试在 ISE 的新实例中运行代码,我认为我可能会遇到持久变量的问题。不,同样的问题。我完全被难住了。我不应该说我在“无法索引到空数组”上得到了很多搜索结果,但它们都引用了数组为空的实际情况。但是$ruleOperationArguments发送到控制台将显示哈希表中唯一为空的部分是我什至没有使用的 note 键,以及在错误条件之前填充的操作数 1。两个 logStrings 都有值,我可以成功更新它们,但仍然会抛出这个错误错误。

编辑:为了尽量减少复杂性,我尝试了这个

$rule = @{
    property = 'size'
    operator = 'lt'
    value = '1000gb'
    note = $null
    logOnForgo = $false
}
$ruleOperationArguments = @{
    operator = $rule.operator
    operand1 = $Null
    logString1 = $rule.property
    operand2 = $rule.value
    logString2 = $rule.value
}
$ruleOperationArguments
$ruleOperationArguments.logString1 = "$($ruleOperationArguments.logString1) changed"
$ruleOperationArguments

并且没有错误。所以代码的其余部分是导致问题的原因,但我仍然不知道是什么。

标签: powershell

解决方案


我想在某个地方,您混淆了错误中提到的行。当我在本地运行原始示例时,直到错误和问题中提到的那一行,都没有发生错误,并且没有任何原因导致上述情况。但是,运行整个事情会导致相同的错误......但对于switch语句条件。忽略此处的行号不匹配:

Cannot index into a null array.
At line:1 char:9
+ switch ($interval[0].Groups['unit'].Value) {
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

更仔细地观察这一点,$interval在任何地方都没有定义。您需要将其初始化为ArrayList或其他类型的集合。


推荐阅读