2016-07-11 15 views
0

Unten ist der letzte Teil eines Skripts, das ich für eine Remote-Inventarisierung von Hosts in meinem Netzwerk übernommen habe. Ich habe am Ende des Skripts mit dem Export-Csv zu kämpfen. Die einzige Möglichkeit, CSV-Dateien zu erhalten, besteht darin, das "-Append" für "-Force" zu ersetzen. Wie erwartet, wird nur der letzte Host in der angegebenen Datei in die foreach-Schleife geschrieben (weil die Schleife jeden Eintrag ohne überschreibt) das "-Append", so dass mir nur die Informationen des letzten Hosts in der exportierten CSV-Datei verbleiben). Mit dem -Append wird die CSV-Datei nicht einmal erstellt; Ich habe auch versucht, die CSV-Datei vor dem Ausführen des Skripts zu erstellen, jedoch wird nichts in die Datei geschrieben. Was mache ich falsch?Export-Csv-Hilfe in PowerShell

foreach ($Network in $Networks) { 
$IPAddress = $Network.IpAddress[0] 
$MACAddress = $Network.MACAddress 
$systemBios = $Bios.serialnumber 
$OutputObj = New-Object -Type PSObject 
$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer.ToUpper() 
$OutputObj | Add-Member -MemberType NoteProperty -Name Manufacturer -Value $Hardware.Manufacturer 
$OutputObj | Add-Member -MemberType NoteProperty -Name Model -Value $Hardware.Model 
$OutputObj | Add-Member -MemberType NoteProperty -Name CPU_Info -Value $cpu.Name 
$OutputObj | Add-Member -MemberType NoteProperty -Name SystemType -Value $Hardware.SystemType 
$OutputObj | Add-Member -MemberType NoteProperty -Name BuildVersion -Value $SysBuild.BuildVersion 
$OutputObj | Add-Member -MemberType NoteProperty -Name OS -Value $OS.Caption 
$OutputObj | Add-Member -MemberType NoteProperty -Name SPVersion -Value $OS.csdversion 
$OutputObj | Add-Member -MemberType NoteProperty -Name SerialNumber -Value $systemBios 
$OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress 
$OutputObj | Add-Member -MemberType NoteProperty -Name MACAddress -Value $MACAddress 
$OutputObj | Add-Member -MemberType NoteProperty -Name UserName -Value $username.Name 
$OutputObj | Add-Member -MemberType NoteProperty -Name Last-Login -Value $username.LastWriteTime 
$OutputObj | Add-Member -MemberType NoteProperty -Name C:_GBfreeSpace -Value $driveSpace.GBfreespace 
$OutputObj | Add-Member -MemberType NoteProperty -Name Total_Physical_Memory -Value $totalMemory 
$OutputObj | Add-Member -MemberType NoteProperty -Name Last_Reboot -Value $lastboot 
$OutputObj | Export-Csv -Append -Path "C:\Users\User1\Desktop\Scripts\pcInventory.csv" -NoTypeInformation 
+0

Erhalten Sie irgendeine Ausnahme? Welche Version von PowerShell verwenden Sie? – pabrams

+0

Danke für die Antwort. Keine Ausnahmen. Ich verwende PSVersion 2.0 – adequ

+0

Der Append-Parameter für Export-Csv wurde nur in PowerShell 3.0 eingeführt – pabrams

Antwort

0

(nicht getestet) eine Option wäre, den Export außerhalb der Schleife setzen wie diese

$results = foreach ($Network in $Networks) { 
    $IPAddress = $Network.IpAddress[0] 
    $MACAddress = $Network.MACAddress 
    $systemBios = $Bios.serialnumber 

    [pscustomobject]@{ 
     ComputerName = $Computer.ToUpper() 
     Manufacturer = $Hardware.Manufacturer 
     Model = $Hardware.Model 
     CPU_Info = $cpu.Name 
     SystemType = $Hardware.SystemType 
     BuildVersion = $SysBuild.BuildVersion 
     OS = $OS.Caption 
     SPVersion = $OS.csdversion 
     SerialNumber = $systemBios 
     IPAddress = $IPAddress 
     MACAddress = $MACAddress 
     UserName = $username.Name 
     Last_Login = $username.LastWriteTime 
     C_GBfreeSpace = $driveSpace.GBfreespace 
     Total_Physical_Memory = $totalMemory 
     Last_Reboot = $lastboot 
    } 
} 

$results | Export-Csv -Path 'C:\Users\User1\Desktop\Scripts\pcInventory.csv' -NoTypeInformation 
+0

Danke für die Hilfe. Ich habe die foreach-Schleife einer Variablen zugewiesen und den export-csv außerhalb der Schleife platziert, wie es empfohlen wird, aber dies hinterlässt eine leere CSV-Datei. – adequ

+1

@adäquate '[pscustobject] @ {...}' ist auch v3-Funktion. Sie müssen stattdessen 'New-Object PSObject -Property @ {...}' in v2 verwenden oder Ihren 'Add-Member' Code verwenden. – PetSerAl

0

die Sie interessieren außerhalb der Schleife. Ich habe es nicht für Ihr Beispiel getestet.

$rows | ConvertTo-Csv | Add-Content 'C:\Users\User1\Desktop\Scripts\pcInventory.csv' 

Fügen Sie diese vor Beginn der Schleife:

$rows = @() 

Und fügen kurz vor dem Ende der Schleife:

$rows += $OutputObj 

Hier ist ein Beispiel ein Dummy-Objekt:

$Networks = @("Network1", "Network2") 
$rows = @() 

foreach ($Network in $Networks) { 

    $OutputObj = New-Object -Type PSObject 
    $OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Network 
    $OutputObj | Add-Member -MemberType NoteProperty -Name Manufacturer -Value $Network 
    $rows += $OutputObj 

} 

$outFile = 'C:\Users\User1\Desktop\Scripts\pcInventory.csv' 

# Need the following to avoid adding header row each time. 
if (test-path $outFile){ 
    $ExistingRowCount = (Import-Csv "$outFile" | measure-Object).Count 
    if ($ExistingRowCount -gt 0){ 
     $rowToStartAppending = 1 
    }else{ 
     $rowToStartAppending = 0 
    } 
}else{ 
    $rowToStartAppending = 0 
} 

$csvContent = $rows | ConvertTo-Csv -NoTypeInformation 
$csvContent[$rowToStartAppending..$csvContent.count] | Add-Content $outFile 
+0

Ich habe das Array erstellt. Das Skript läuft gut und die CSV-Datei ist gefüllt. Es überschreibt jedoch immer noch alle außer dem letzten Objekt in der Schleife. – adequ

+0

Ich bin mir nicht sicher, was Sie genau meinen. Ich bearbeite meine Antwort, um ein vollständigeres Beispiel hinzuzufügen. Wenn Ihre Frage nicht beantwortet wird, sollten Sie mehr Code hinzufügen - siehe "So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel" in der Hilfe. – pabrams

0

Dies ist ein scr ipt ich habe andere Eigenschaften von dem, was Sie brauchen

$serverList = "c:\COMPUTERS.TXT" 
$outputCSV = "D:\RFV.csv" 


$scriptpath = $MyInvocation.MyCommand.Path 
#$dir = Split-Path $scriptpath 
pushd $dir 

[System.Collections.ArrayList]$sysCollection = New-Object System.Collections.ArrayList($null) 

foreach ($server in (Get-Content $serverList)) 
{ 
    "Collecting information from $server" 
    $totCores=0 

    try 
    { 
     [wmi]$sysInfo = get-wmiobject Win32_ComputerSystem -Namespace "root\CIMV2" -ComputerName $server -ErrorAction Stop 
     [wmi]$bios = Get-WmiObject Win32_BIOS -Namespace "root\CIMV2" -computername $server 
     [wmi]$os = Get-WmiObject Win32_OperatingSystem -Namespace "root\CIMV2" -Computername $server 
     [array]$disks = Get-WmiObject Win32_LogicalDisk -Namespace "root\CIMV2" -Filter DriveType=3 -Computername $server 
     [array]$disks = Get-WmiObject Win32_LogicalDisk -Namespace "root\CIMV2" -Computername $server 
     [array]$procs = Get-WmiObject Win32_Processor -Namespace "root\CIMV2" -Computername $server 
     [array]$mem = Get-WmiObject Win32_PhysicalMemory -Namespace "root\CIMV2" -ComputerName $server 
     [array]$nic = Get-WmiObject Win32_NetworkAdapterConfiguration -Namespace "root\CIMV2" -ComputerName $server | where{$_.IPEnabled -eq "True"} 

     $si = @{ 
      Server   = [string]$server 
      Manufacturer = [string]$sysInfo.Manufacturer 
      Model   = [string]$sysInfo.Model 
      TotMem   = "$([string]([System.Math]::Round($sysInfo.TotalPhysicalMemory/1gb,2))) GB" 
      BiosDesc  = [string]$bios.Description 
      BiosVer   = [string]$bios.SMBIOSBIOSVersion+"."+$bios.SMBIOSMajorVersion+"."+$bios.SMBIOSMinorVersion 
      BiosSerial  = [string]$bios.SerialNumber 
      OSName   = [string]$os.Name.Substring(0,$os.Name.IndexOf("|") -1) 
      ServicePack = (“SP {0}” -f [string]$os.ServicePackMajorVersion) 
      Arch   = [string]$os.OSArchitecture 
      Processors  = [string]@($procs).count 
      Cores   = [string]$procs[0].NumberOfCores 

     } 

     $disks | foreach-object {$si."Drive$($_.Name -replace ':', '')"="$([string]([System.Math]::Round($_.Size/1gb,2))) GB"} 



    } 
    catch [Exception] 
    { 
     "Error communicating with $server, skipping to next" 
     $si = @{ 
      Server   = [string]$server 
      ErrorMessage = [string]$_.Exception.Message 
      ErrorItem  = [string]$_.Exception.ItemName 
     } 
     Continue 
    } 
    finally 
    { 
     [void]$sysCollection.Add((New-Object PSObject -Property $si)) 
    } 
} 

$sysCollection ` 
    | select-object Server,TotMem,OSName,Arch,ServicePack,Processors,Cores,Manufacturer,Model,BiosDesc,BiosVer,BiosSerial,DriveA,DriveB,DriveC,DriveD,DriveE,DriveF,DriveG,DriveH,DriveI,DriveJ,DriveK,DriveL,DriveM,DriveN,DriveO,DriveP,DriveQ,DriveR,DriveS,DriveT,DriveU,DriveV,DriveW,DriveX,DriveY,DriveZ,ErrorMessage,ErrorItem ` 
    | sort -Property Server ` 
    | Export-CSV -path $outputCSV -NoTypeInformation 
    Write-Host "inventory completed check $outputCSV" -backgroundcolor "green" 
+0

Vielen Dank für die Freigabe Ihres Codes. Ich kann definitiv daran arbeiten, dies zu modifizieren, um alle benötigten Informationen zu erhalten. Ich hatte wirklich gehofft herauszufinden, warum das, was ich habe, nicht funktioniert. Ich bekomme entweder nichts in der CSV oder ich bekomme das letzte Objekt in der Schleife. Danke noch einmal. – adequ

+0

Ich sehe nicht, dass Sie Get-WmiObject hinzugefügt haben, um Informationen aus WMI abzurufen. Das Beste, was Sie tun können, ist, die Eigenschaften dessen, was Sie nicht benötigen, zu entfernen und alles hinzuzufügen, was Sie wollen. Es funktioniert einwandfrei für mich Ich fügte alle Informationen von dem, was ich brauche Sie für urs ändern können – DisplayName

+0

Danke nochmal. Ich konnte alles entfernen, was ich nicht brauchte, und ich fand heraus, wie man den Benutzernamen, die letzte Startzeit, IPv4 und MAC hinzufügt. Hoffentlich kann ich der Community mit dem, was ich gelernt habe, etwas zurückgeben! – adequ