मेरी स्क्रिप्ट प्रत्येक "फॉर्च्यूनर" लूप के बाद पिछली प्रविष्टि को ओवरराइट करती है


0

मेरे पास जो स्क्रिप्ट है, वह मेरे द्वारा वांछित जानकारी को लिखता है। हालाँकि मैंने देखा है कि प्रत्येक नई मान्य प्रविष्टि अंतिम की जगह लेती है। मैं यह पता नहीं लगा सकता कि क्यों। तो क्या मैं अंत में हर बार सिर्फ 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))
     {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
}
}

आपने क्या प्रयास किया है? ऐसा लगता है कि आप Array में ठीक से आइटम नहीं जोड़ रहे हैं।
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.