Мой скрипт перезаписывает предыдущую запись после каждого цикла foreach

270
David Prentice

Сценарий, который я здесь, записывает информацию, которую я хочу. Однако я заметил, что каждая новая действительная запись заменяет последнюю. Я не могу понять, почему. Так что в итоге я получаю только 1 запись, даже если обнаружено 1000 компьютеров. Пожалуйста, помогите мне разобраться с этим.

$computers = Get-ADComputer -SearchBase "DC=some,DC=web,DC=com" -Filter * | Select-Object -ExpandProperty Name foreach ($computer in $computers){ if(!(Test-Connection -CN $computer -BufferSize 16 -Count 1 -ea 0 -quiet))  else { $outtbl = @() Try{ $sr=Get-WmiObject -Class Win32_BIOS -ComputerName $computer -ErrorAction Continue  $Xr=Get-WmiObject -Class Win32_Processor -ComputerName $computer -ErrorAction Continue  $ld=Get-ADComputer $computer -Properties * -ErrorAction Continue $r=" GB" -f ((Get-WmiObject Win32_PhysicalMemory -ComputerName $computer |Measure-Object Capacity -Sum).Sum / 1GB) $x = gwmi win32_computersystem -ComputerName $computer |select @ Else {'Desktop Or Other something else.'}}},Manufacturer,@ Else {$_.model}}},username -ErrorAction Continue $t= New-Object PSObject -Property @{ ServiceTag = $sr.serialnumber ComputerName = $ld.name IPV4Address=$ld.ipv4Address Enabled=$ld.Enabled Description=$ld.description OU=$ld.DistinguishedName.split(',')[1].split('=')[1]  Type = $x.type Manufacturer=$x.Manufacturer Model=$x.Model RAM=$R ProcessorName=($xr.name | Out-String).Trim() NumberOfCores=($xr.NumberOfCores | Out-String).Trim() NumberOfLogicalProcessors=($xr.NumberOfLogicalProcessors | Out-String).Trim() AddressWidth=($xr.Addresswidth | Out-String).Trim() OperatingSystem=$ld.operatingsystem OperatingSystemServicePack=$ld.OperatingSystemServicePack OperatingSystemVersion=$ld.OperatingSystemVersion OperatingSystemHotfix=$ld.OperatingSystemHotfix LastLogonDate=$ld.lastlogondate ObjectCreated=$ld.Created ObjectModified=$ld.whenChanged LoggedInUser=$x.username } $outtbl += $t } catch [Exception] { "Error communicating with $computer, skipping to next" } $outtbl | select Computername,ServiceTag,IPV4Address,Description,Enabled,OU,Type,Manufacturer,Model,RAM,ProcessorName,NumberOfCores,NumberOfLogicalProcessors,AddressWidth,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion,OperatingSystemHotfix,ObjectCreated,ObjectModified,LoggedInUser,LastLogonDate | Format-Table * -Wrap -AutoSize | Out-String -Width 4096 | Out-File $env:USERPROFILE\Desktop\AD-Inventory.txt } } 
0
Что вы пробовали? Похоже, вы не добавляете элементы в массив должным образом. Twisty Impersonator 6 лет назад 0

1 ответ на вопрос

1
SimonS

Ваша проблема была в том, что файл перезаписывался в каждом цикле. Теперь ваш скрипт сначала сохранит все в переменную, а затем в конце экспортирует.

еще несколько проблем с вашим скриптом:

  • try / catch никогда не поймает ничего в данный момент, потому что нет завершающей ошибки.
  • формат вашего сценария был ужасным - пожалуйста, отформатируйте его лучше, иначе его очень трудно прочитать.
  • почему вы выбираете все в конце перед экспортом? если вы хотите экспортировать все, что вам не нужно выбирать вещи. если это для цели сортировки, измените New-Object PSObject -propertyна [pscustomobject], это уже заставит правильный порядок сортировки

вот обновленный скрипт

$computers = Get-ADComputer -SearchBase "DC=some,DC=web,DC=com" -Filter * | Select-Object -ExpandProperty Name $outtbl = foreach ($computer in $computers){ if(!(Test-Connection -CN $computer -BufferSize 16 -Count 1 -ea 0 -quiet)) {  write-host "Cannot reach $computer offline." -f red  } else { Try{ $sr = Get-WmiObject -Class Win32_BIOS -ComputerName $computer -ErrorAction Continue  $Xr = Get-WmiObject -Class Win32_Processor -ComputerName $computer -ErrorAction Continue  $ld = Get-ADComputer $computer -Properties * -ErrorAction Continue $r = " GB" -f ((Get-WmiObject Win32_PhysicalMemory -ComputerName $computer | Measure-Object Capacity -Sum).Sum / 1GB) $x = gwmi win32_computersystem -ComputerName $computer | select @ Else {'Desktop Or Other something else.'}}},Manufacturer,@ Else {$_.model}}},username -ErrorAction Continue New-Object PSObject -Property @{ ServiceTag = $sr.serialnumber ComputerName = $ld.name IPV4Address=$ld.ipv4Address Enabled=$ld.Enabled Description=$ld.description OU=$ld.DistinguishedName.split(',')[1].split('=')[1]  Type = $x.type Manufacturer=$x.Manufacturer Model=$x.Model RAM=$R ProcessorName=($xr.name | Out-String).Trim() NumberOfCores=($xr.NumberOfCores | Out-String).Trim() NumberOfLogicalProcessors=($xr.NumberOfLogicalProcessors | Out-String).Trim() AddressWidth=($xr.Addresswidth | Out-String).Trim() OperatingSystem=$ld.operatingsystem OperatingSystemServicePack=$ld.OperatingSystemServicePack OperatingSystemVersion=$ld.OperatingSystemVersion OperatingSystemHotfix=$ld.OperatingSystemHotfix LastLogonDate=$ld.lastlogondate ObjectCreated=$ld.Created ObjectModified=$ld.whenChanged LoggedInUser=$x.username } } catch [Exception] { "Error communicating with $computer, skipping to next" } } }  $outtbl | select Computername,ServiceTag,IPV4Address,Description,Enabled,OU,Type,Manufacturer,Model,RAM,ProcessorName,NumberOfCores,NumberOfLogicalProcessors,AddressWidth,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion,OperatingSystemHotfix,ObjectCreated,ObjectModified,LoggedInUser,LastLogonDate | Format-Table * -Wrap -AutoSize | Out-String -Width 4096 | Out-File $env:USERPROFILE\Desktop\AD-Inventory.txt 
Это здорово, и я ценю, что вы дали мне совет по оптимизации для организации! Я пытаюсь выяснить, как включить автономный компьютер «Не удается подключиться к компьютеру в автономном режиме», а также обнаружил подключенные к сети компьютеры для более полного списка. Я думаю, что я сделал бы это с переменными, но не уверен ... David Prentice 6 лет назад 0
@DavidPrentice все выходные данные внутри ʻforeach () {} `в настоящее время сохраняются в переменную` $ outtbl`. Вы можете немного поиграть с этим. например, создание того же `PSCustomObject`, когда компьютер находится в автономном режиме или в сети. SimonS 6 лет назад 0