สคริปต์ของฉันเขียนทับรายการก่อนหน้าหลังจากวน "foreach" แต่ละครั้ง


0

สคริปต์ที่ฉันมีที่นี่เขียนข้อมูลที่ฉันต้องการ อย่างไรก็ตามฉันสังเกตเห็นว่าแต่ละรายการที่ถูกต้องใหม่จะแทนที่รายการสุดท้าย ฉันไม่สามารถหาสาเหตุ ดังนั้นสิ่งที่ฉันจบลงก็คือเพียง 1 รายการทุกครั้งแม้ว่าจะตรวจพบคอมพิวเตอร์ 1,000 เครื่อง โปรดช่วยฉันหาสิ่งนี้ด้วย

$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))
     {write-host "Cannot reach $computer offline." -f red}
      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="{0} GB" -f ((Get-WmiObject Win32_PhysicalMemory -ComputerName $computer |Measure-Object Capacity  -Sum).Sum / 1GB)
$x = gwmi win32_computersystem -ComputerName $computer |select @{Name = "Type";Expression = {if (($_.pcsystemtype -eq '2')  ) 

{'Laptop'} Else {'Desktop Or Other something else.'}}},Manufacturer,@{Name = "Model";Expression = {if (($_.model -eq "$null")  ) {'Virtual'} 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
}
}

คุณลองทำอะไร ดูเหมือนว่าคุณไม่ได้เพิ่มรายการลงในอาร์เรย์อย่างถูกต้อง
Twisty Impersonator

คำตอบ:


1

ปัญหาของคุณคือไฟล์ถูกเขียนทับในทุกลูป ตอนนี้สคริปต์ของคุณจะบันทึกทุกอย่างลงในตัวแปรก่อนแล้วจึงส่งออกในท้ายที่สุด

ปัญหาเพิ่มเติมเล็กน้อยกับสคริปต์ของคุณ:

  • ความพยายาม / จับจะไม่ตรวจจับสิ่งใดในขณะนี้เนื่องจากไม่มีข้อผิดพลาดในการยกเลิก
  • รูปแบบของสคริปต์ของคุณน่ากลัว - โปรดจัดรูปแบบให้ดีขึ้นมิฉะนั้นอ่านยาก
  • ทำไมคุณถึงเลือกทุกอย่างในท้ายที่สุดก่อนที่จะส่งออก? หากคุณต้องการส่งออกทุกสิ่งคุณไม่จำเป็นต้องเลือกรายการ ถ้ามันมีวัตถุประสงค์เพื่อเรียงลำดับเปลี่ยน 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  = "{0} GB" -f ((Get-WmiObject Win32_PhysicalMemory -ComputerName $computer | Measure-Object Capacity  -Sum).Sum / 1GB)
            $x  = gwmi win32_computersystem -ComputerName $computer | select @{Name = "Type";Expression = {if (($_.pcsystemtype -eq '2')  ) 
                  {'Laptop'} Else {'Desktop Or Other something else.'}}},Manufacturer,@{Name = "Model";Expression = {if (($_.model -eq "$null")  ) {'Virtual'} 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

@DavidPrentice เอาต์พุตทั้งหมดที่อยู่ภายใน foreach() {} ถูกบันทึกลงใน $outtbl ตัวแปร. คุณสามารถเล่นกับสิ่งนั้นได้เล็กน้อย เช่นสร้างเหมือนกัน PSCustomObject เมื่อคอมพิวเตอร์ออฟไลน์หรือออนไลน์
SimonS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.