Заполнить пустой массив из цикла foreach-object и экспортировать CSV

Наконец-то я заработал функциональность моего скрипта, теперь я хочу сохранить в CSV, я использую | Export-CSV -path .\output.csv -Delimiter ";". но не могу получить нужные мне данные.

Я создаю глобальный пустой массив и пытаюсь добавить элементы в цикл foreach-object но получить пустой CSV

я также запускаю свой foraech-object в качестве задания и передаю | Export-CSV -path .\output.csv -Delimiter ";" и получаю случайный набор чисел

как я могу получить свои данные в CSV?

Мой сценарий

Function Get-FileName{
    [System.Reflection.Assembly]::LoadWithPartialName(“System.windows.forms”) | Out-Null
    $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $OpenFileDialog.initialDirectory = Get-Location
    $OpenFileDialog.filter = “All files (*.*)| *.*”
    $OpenFileDialog.ShowDialog() | Out-Null
    $OpenFileDialog.filename
}

$Importfile = Get-FileName
$Clients = Get-Content $Importfile

$Do = $Clients | ForEach-Object -Parallel {
    # CHECK IF  PC IS IN AD  AND  STATUS  OF  PC IN AD   ENABLED/DISABLED
    $O = get-ADComputer -Identity $_ -Properties Enabled
        if ($O."Enabled" -eq 'TRUE') {

            #CHECK IF PC IS  NETWORK ACCESSIBLE 
            if (Test-Connection -ComputerName $_ -Count 2 -Quiet){

                try{ 
                    #GET  LATEST KB PATCH INSTALLED 
                    Get-HotFix -ComputerName $_ -Description 'Security Update' | Select-Object -Last 1 # tried  to get csv from here  and only capture  what passes through here and not the  catch or elses also tryed appending this to empty array  
                    }
                catch{ 
                    "$_;An error occurred." 
                }  
            }
            else{
                "$_;not on line "
            }
        } 
        else{
            "$_;Disabled PC"
        } 
} -AsJob 

$Do | Receive-Job -Wait   # i tried  " | Export-CSV -path .\output.csv -Delimiter ";" " and  got random  data 

команда Foreach-Object -Parallel недоступна, если у вас нет PS7+. вы говорите, что используете ps3 ... так что вы получаете какие-либо ошибки от этого неправильного использования? [усмехается] ///// также использование $Job для имени переменной несколько вводит в заблуждение, поскольку существуют командлеты PSJob. я настоятельно рекомендую вам НИКОГДА не использовать ключевые слова или существительные командлетов специального назначения для имен переменных.

Lee_Dailey 11.12.2020 03:31

Привет, Lee_Dailey. Я забыл упомянуть, что вчера я обновился до PS 7.01 и изменю имена переменных. Я не знал, что РАБОТА была ключевым словом ... просто изучение PS без формального изучения - это больше практические занятия, потому что это нужно делать. спасибо за исправление

victorR 11.12.2020 03:45
job не ключевое слово ... это довольно конкретное существительное, используемое в *-Job командлетах. использование его для имени $Var может привести к путанице, когда люди прочитают его и подумают... "я не вижу ничего общего с заданиями...". [усмехается] ///// Пожалуйста, УДАЛИТЕ тег ps3 и добавьте тег ps7, чтобы люди не путались в ваших тегах.
Lee_Dailey 11.12.2020 03:54

Сделанный ! Спасибо. Вы случайно не знаете PS 7???

victorR 11.12.2020 03:58

Спасибо! К сожалению, я до сих пор не зашел в ps7 в это время. я не вижу ничего явно неправильного в вашем коде, хотя. ///// я бы, скорее всего, переключился на использование Invoke-Command, так как вы можете дать ему блок сценария и список целевых систем ... и он будет запускать блок сценария на каждой системе параллельно. вы также можете отловить не ответивших с помощью -ErrorVariable или сравнив ответивших с целевым списком.

Lee_Dailey 11.12.2020 04:11

Вам нужно передать (список) [pscustomobject] , а не [String], который требуется для ввода Export-Csv.

iRon 11.12.2020 09:11

@iRon Я на самом деле новичок в написании сценариев для PS и PS, а английский не является моим родным языком. У вас есть ссылка на ресурс, на котором я могу узнать, о чем вы говорите, или вы можете объяснить проще, пожалуйста?

victorR 11.12.2020 10:10

@Lee_Dailey К сожалению, для запуска Invoke-Command требуется, чтобы WinRm был включен на клиентском ПК. Это не так, и мне пришлось бы включать службу вручную, поскольку сетевой администратор не будет создавать объект групповой политики ... с текущим сценарием я могу получить результат, который я хочу, но не могу создать CSV, шкафы, которые я получил, сделал это Get-HotFix -ComputerName $_ -Description 'Security Update' | Select-Object -Last | Export-Csv -path .\OutputFile.csv -Delimiter ";", но это фиксирует в CSV только те записи, которые попадают в это условие IF, а не ошибки или офлайн.

victorR 11.12.2020 10:18

@Lee_Dailey Как я уже упоминал, я попытался создать глобальный пустой массив и попытался добавить данные в массив в зависимости от того, какое условие было выполнено, и в конце скрипта попытался поместить это в файл CSV, но массив никогда не заполнял информацию

victorR 11.12.2020 10:23

@victorR - взгляните на это >>> Get-Help New-CimSessionOption -Parameter protocol <<< и на это >>> Get-Help Invoke-Command -Parameter session <<< //// это означает, что вы можете использовать DCOM вместо WSMan. если вы можете использовать командлеты WMI для доступа к этим системам... тогда вы можете использовать Invoke-Command через New-CimSession. [ухмылка]

Lee_Dailey 11.12.2020 10:25

@Lee_Dailey хорошо, он подключился к удаленному хосту, но я не могу запустить «invoke-command». cim-session и invoke-method - новый монстр, которого мне нужно исследовать ... можете ли вы привести пример запуска invoke-command, хотя, пожалуйста, cimsession

victorR 11.12.2020 11:17

@victorR — используйте New-CimSessionOption, чтобы установить протокол. затем используйте New-CimSession, чтобы создать сеансы для всех [или группы] целей. затем используйте параметр -Session для Invoke-Command, чтобы указать ему использовать коллекцию сеансов по мере необходимости. наконец, подайте блок сценария на вызов I-C. что должен сделать это. в настоящее время у меня нет ничего, чтобы проверить это ... только моя единственная домашняя система.

Lee_Dailey 11.12.2020 12:35

@Lee_Dailey Я попробовал это, и вот что у меня получилось " Invoke-Command -session $ses {get-hotfix} Invoke-Command: Cannot bind parameter 'Session'. Cannot convert the "CimSession: PC-w032" value of type "Microsoft.Management.Infrastructure.CimSession" to type "System.Management.Automation.Runspaces.PSSession". это было после того, как я создал новую сессию с протоколом DCOM

victorR 11.12.2020 17:20

@victorR - я вижу, что iRon опубликовал рабочий ответ. так как у меня нет никакого способа протестировать проблемы CIMSession, я предлагаю оставить это и использовать рабочее решение, представленное iRon.

Lee_Dailey 12.12.2020 02:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
14
398
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как человек «новичок в PS», я рекомендую вам сделать несколько шагов назад и упростить вещи, а также удалить переключатель -Parallel, который может скрыть вывод. Как уже отмечалось, для командлета Export-Csv требуется поток только элементов [pscustomobject], вы не можете комбинировать это со строками (например, "$_;An error occurred.") или объектом с другими свойствами.
См.: Не все свойства отображаются и #13906 Добавить параметр -UnifyProperties в Select-Object

function UniteProperties { # https://github.com/PowerShell/PowerShell/issues/13906#issuecomment-717480544
  [System.Collections.Generic.List[string]] $propNames = @()
  [System.Collections.Generic.HashSet[string]] $hashSet = @()
  $inputCollected = @($input)
  $inputCollected.ForEach({ 
    foreach ($name in $_.psobject.Properties.Name) {
      if ($hashSet.Add($name)) { $propNames.Add($name) }
    }
  })
  $inputCollected | Select-Object $propNames
}

$Do = 2, 3, 0, 5 | ForEach-Object -Parallel {
    Try {
        [pscustomobject]@{ Name = "Client$_"; HotFix = 1/$_ } # some standard HotFix results
    }
    Catch {
        [pscustomobject]@{ message = "$_;An error occurred." }
    }
}
$Do | UniteProperties | ConvertTo-Csv # Or ... Export-Csv

"Name","HotFix","message"
"Client2","0.5",
"Client3","0.3333333333333333",
,,"Attempted to divide by zero.;An error occurred."
"Client5","0.2",

Другие вопросы по теме