Как исправить Невозможность индексирования в нулевой массив в PowerShell

#powershell #csv #powershell-2.0

Вопрос:

Я пытаюсь преобразовать свой 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:AuditLogSearchModified-Audit-Log-Records.csv"  $actionReference = Import-Csv "C:AuditLogSearchReferenceAction.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 amp; Time" = $u."Date amp; 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 # =gt; This will hide the GridLines on your file  Close-ExcelPackage $xlsx  }  }  

введите описание изображения здесь

Комментарии:

1. Где это $xlsx определено?

2. @MathiasR.Jessen Привет, я обновил опубликованное, поэтому, пожалуйста, проверьте. $xlsx определен для каждого.

3. foreach ничего не возвращает. К чему ты пытаешься приступить $xlsx ?

4. Вы должны, по крайней мере, установить его в новый экземпляр объекта excel.

5. @Джесси, не могли бы вы, пожалуйста, показать мне, как это сделать?. Я застрял с этой ошибкой в течение последних нескольких часов 🙁

Ответ №1:

Вы закрываете пакет Excel на первой итерации своего цикла, поэтому, когда он переходит к следующему, он пытается сделать что-то подобное:

 $null[$null] # =gt; 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 amp; Time" = $u."Date amp; 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 # =gt; This will hide the GridLines on your file Close-ExcelPackage $xlsx  

Одна вещь, которую следует отметить, PassThru = $true $params означает, что вместо прямого сохранения Excel мы хотим сохранить объект в переменной для «дальнейших манипуляций», и под дальнейшими манипуляциями я имею в виду, в данном случае, скрытие линий сетки рабочего листа ( $ws.View.ShowGridLines = $false ), а затем закрытие пакета (сохраните его на диске).

Если вам не требуется вносить какие-либо изменения в рабочий лист, вы можете просто удалить PassThru его полностью и сделать:

 $result | Export-Excel @params  

Который закроет пакет и сохранит Excel на вашем диске.

Комментарии:

1. @aaselab рад помочь 🙂 пожалуйста, посмотрите мое последнее обновление, я чувствую ответственность за то, что указал на это, так как я познакомил вас с ImportExcel Модулем.

2. Огромное спасибо. 🙂