如何修复无法索引到 PowerShell 中的空数组

Posted

技术标签:

【中文标题】如何修复无法索引到 PowerShell 中的空数组【英文标题】:How to fix Cannot index into a null array in PowerShell 【发布时间】:2022-01-09 10:13:13 【问题描述】:

我正在尝试将我的 CSV 文件转换为具有某种表格格式和样式的 Excel 文件,但由于某种原因,我收到“无法索引到空数组”。如果我能得到任何帮助或建议,我将不胜感激。谢谢

function Convert-to-Excel
  $params = @
        AutoSize      = $true
        TableStyle    = 'Medium6'
        BoldTopRow    = $true
        WorksheetName = 'Audit Log'
        PassThru      = $true
        Path          = "C:\AuditLogSearch\$((Get-Date).AddDays(-7).ToString('yyyy-MM-dd')) _ $(Get-Date -Format "yyyy-MM-dd") Audit-Log-Records11.xlsx"
    

    $modifiedFile = Import-Csv "C:\AuditLogSearch\Modified-Audit-Log-Records.csv"
    $actionReference = Import-Csv "C:\AuditLogSearch\Reference\Action.csv"

    $xlsx = foreach ($u in $modifiedFile) 
        $u.User = (Get-AzureADUser -ObjectId $u.User).DisplayName
        New-Object PsObject -Property @
            User              = $u.User
            "Search Criteria" = $u."Search Criteria"
            "Result Status"   = $u."Result Status"
            "Date & Time"     = $u."Date & Time"
            "Type of Action"  = if (($actionReference | where-object  $_.Name -eq $u."Type of Action" ).Value -ne $null)  ($actionReference | where-object  $_.Name -eq $u."Type of Action" ).Value 
            else  $u."Type of Action" 
         | Export-Excel @params

        $ws = $xlsx.Workbook.Worksheets[$params.Worksheetname]
        $ws.View.ShowGridLines = $false # => This will hide the GridLines on your file
        Close-ExcelPackage $xlsx
     

【问题讨论】:

$xlsx 定义在哪里? @MathiasR.Jessen 嗨,我更新了发布的内容,请检查。 $xlsx 是为 foreach 定义的。 foreach 不返回任何内容。你想把$xlsx 设置成什么? 您至少应该将其设置为 excel 对象的新实例。 @Jesse 你能告诉我怎么做吗?在过去的几个小时里,我一直被这个错误困扰:( 【参考方案1】:

您在循环的第一次迭代中关闭 Excel 包,因此为什么当它进入下一个迭代时它会尝试执行以下操作:

$null[$null] # => InvalidOperation: Cannot index into a null array

尝试修改你的函数,让它看起来像这样:

首先,构造object[]
$result = foreach ($u in $modifiedFile) 
    $u.User = (Get-AzureADUser -ObjectId $u.User).DisplayName
    New-Object PsObject -Property @
        User              = $u.User
        "Search Criteria" = $u."Search Criteria"
        "Result Status"   = $u."Result Status"
        "Date & Time"     = $u."Date & Time"
        "Type of Action"  = if (($actionReference.........
        else  $u."Type of Action" 
    

然后将其导出到 Excel:
$xlsx = $result | Export-Excel @params
$ws = $xlsx.Workbook.Worksheets[$params.Worksheetname]
$ws.View.ShowGridLines = $false # => This will hide the GridLines on your file
Close-ExcelPackage $xlsx

有一点需要注意,$params 上的 PassThru = $true 意味着我们不是直接保存 Excel,而是希望将对象保存在变量上以进行“进一步操作”,通过进一步操作,我的意思是,在这种情况下,隐藏工作表的 GridLines ($ws.View.ShowGridLines = $false),然后关闭包(将其存储在磁盘上)。

如果您不需要对工作表进行任何修改,您可以完全删除 PassThru 并执行以下操作:

$result | Export-Excel @params

这将关闭包并将 Excel 存储在您的磁盘上。

【讨论】:

@aaselab 很乐意提供帮助 :) 请查看我的最新更新,自从我向您介绍 ImportExcel 模块后,我觉得有责任指出这一点。 非常感谢。 :)

以上是关于如何修复无法索引到 PowerShell 中的空数组的主要内容,如果未能解决你的问题,请参考以下文章

尝试打开 Android XML 文件时如何修复 Eclipse 中出现的空指针异常?

PowerShell\WPF:使用数据模板的 PowerShell 中的空单选按钮对象

如何修复 PowerShell 中的 SPOService 登录问题

如何在观察实时数据的值时修复“resp”的空指针

更新informix中的行时如何修复错误-245

如何修复win10内置应用“电影和电视”