powershell - 无法索引到空数组,但是没有数组,它是一个哈希表,并且哈希表不为空
问题描述
我有以下代码,它不仅仅是功能最低的,但我希望它仍然可以理解。
$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.logString1
IS的实际最终值已更新以包含实际尺寸数据。
我还尝试不通过附加到自身来修改哈希表值,而是使用相同的结果。
$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
并且没有错误。所以代码的其余部分是导致问题的原因,但我仍然不知道是什么。
解决方案
我想在某个地方,您混淆了错误中提到的行。当我在本地运行原始示例时,直到错误和问题中提到的那一行,都没有发生错误,并且没有任何原因导致上述情况。但是,运行整个事情会导致相同的错误......但对于switch
语句条件。忽略此处的行号不匹配:
Cannot index into a null array.
At line:1 char:9
+ switch ($interval[0].Groups['unit'].Value) {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
更仔细地观察这一点,$interval
在任何地方都没有定义。您需要将其初始化为Array
、List
或其他类型的集合。
推荐阅读
- java - 如何在 Java 中将 JMSBytesMessage 转换为 TextMessage
- mongodb - 为什么 mongodb upsert 计数器不反映实际变化?
- javascript - 我无法正确创建别名
- python - 在python中读取和解释混合的二进制和文本文件
- r - 无法使用多个 geom_point 和 geom_smooth 指定颜色
- facebook - Flutter:显示也使用该应用程序的 Facebook 朋友
- azure - 能否将 MSI 令牌用于 Azure DevOps REST API?
- java - 并行执行在 Appium 中不起作用
- c# - Excel 2019 从 ashx 处理程序获取数据时引发 XML 错误
- javascript - 我使用这个 Javascript 代码,它可以完成这项工作,但我觉得它可能会更短