none
CSV als Datenquelle nutzen RRS feed

  • Frage

  • Hallo liebe Freunde,

    ich bin neu in Powershell.
    Ich habe ein Skript geschrieben, daß alle Win7 Rechner aus dem AD ausliest, die Erreichbarkeit per Ping testet und die Ergebnisse in eine CSV exportiert.
    Diese Liste soll ein Grundlage dienen um ein zweites Skript zu füttern.
    Leider habe ich ein Problem die CSV zu verwenden und weiß nciht woran es liegt.

    $Computers = Import-Csv -Path .\Hosts.csv
    $Path1 = "C:\Windows\Softwaredistribution\Download"
    $Path2 = "C:\Windows\SoftwareDistribution\DataStore"
    $Path3 = "C:\Windows\winsxs"
    
    Param(
    [Array] $Computers
    )
    
    Function Class-Size($size){
    	IF($size -ge 1GB)
    	{
    	"{0:n2}" -f  ($size / 1GB) + " GB"
    	}
    	ELSEIF($size -ge 1MB)
    	{
    	"{0:n2}" -f  ($size / 1MB) + " MB"
    	}
    	ELSE
    	{
    	"{0:n2}" -f  ($size / 1KB) + " KB"
    }
    } 
    
    function Get-FolderSize {
    
    Param(
    [Array]$Computers
    ) 
    
    $Array = @()
    Foreach($ComputerName in $Computers) {
        $ErrorActionPreference = "SilentlyContinue"
    
    	$Length1 = Invoke-Command -ComputerName $Computer -ScriptBlock {
    	 (Get-ChildItem C:\Windows\Softwaredistribution\Download -Recurse | Measure-Object -Property Length -Sum).Sum 
    	 #(Get-ChildItem C:\Windows\SoftwareDistribution\DataStore -Recurse | Measure-Object -Property Length -Sum).Sum
    	 #(Get-ChildItem C:\Windows\winsxs -Recurse | Measure-Object -Property Length -Sum).Sum
    	 }
    
    	$Result = "" | Select Computer,Folder,Length
    	$Result.Computer = $Computer
    	$Result.Folder = $Path1
    	$Result.Length = Class-Size $length1
    	$array += $Result
    	
    	$Length2 = Invoke-Command -ComputerName $Computer -ScriptBlock {
    	 (Get-ChildItem C:\Windows\SoftwareDistribution\DataStore -Recurse | Measure-Object -Property Length -Sum).Sum
    	 }
    
    	$Result = "" | Select Computer,Folder,Length
    	$Result.Computer = $Computer
    	$Result.Folder = $Path2
    	$Result.Length = Class-Size $length2
    	$array += $Result
    <#
    	$Length3 = Invoke-Command -ComputerName $Computer -ScriptBlock {
    	(Get-ChildItem C:\Windows\winsxs -Recurse | Measure-Object -Property Length -Sum).Sum
    	 }
    
    	$Result = "" | Select Computer,Folder,Length
    	$Result.Computer = $Computer
    	$Result.Folder = $Path3
    	$Result.Length = Class-Size $length3
    	$array += $Result
    #>	
    }
    
    return $array | Export-Csv -NoTypeInformation C:\Work\Result.csv
    }
    
    Get-FolderSize -Computers $Computers.ComputerName

    Die Syntax is:

    Get-FolderSize -Computers Client001, Client002 usw.


    Die CSV sieht wie folgt aus:

    ComputerName,"Status"
    Client001,"True"
    Client002,"True"


    Montag, 12. November 2018 13:36

Antworten


  • Leider habe ich ein Problem die CSV zu verwenden und weiß nciht woran es liegt.

    Moin,

    Du sagst ja auch leider nicht, wie sich das Problem äußert ;-) 

    Aber jede Zeile Deiner CSV ergibt ja beim Import ein Objekt mit 2 Properties: ComputerName und Status. Daher vermute ich, dass Deine Schleife so aussehen muss:

    foreach($ComputerName in $Computers.ComputerName) {
        ...
    }
    denn Status wertest Du ja nirgends aus.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Montag, 12. November 2018 13:45
  • Nur so am Rande: Mit 
    return 
    kannst du Daten von einem Skript an ein anderes übergeben. D.h., du kannst deine beiden Skripte zentral ausführen und brauchst keine csv-Datei, falls alles direkt hintereinander läuft. Siehe folgendes kleines Beispiel aus 3 Skript-Dateien; natürlich kann man auch komplexe Objekte übergeben.
    Main.ps1:
    
    $Daten = & Skript1.ps1
    & Skript2.ps1
    
    
    Skript1.ps1:
    
    return "ABC"
    
    
    
    Skript2.ps1:
    
    param($myParameter)
    Write-Host "Meine Eingabe ist $myParameter"

    Dienstag, 13. November 2018 14:10

Alle Antworten


  • Leider habe ich ein Problem die CSV zu verwenden und weiß nciht woran es liegt.

    Moin,

    Du sagst ja auch leider nicht, wie sich das Problem äußert ;-) 

    Aber jede Zeile Deiner CSV ergibt ja beim Import ein Objekt mit 2 Properties: ComputerName und Status. Daher vermute ich, dass Deine Schleife so aussehen muss:

    foreach($ComputerName in $Computers.ComputerName) {
        ...
    }
    denn Status wertest Du ja nirgends aus.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Montag, 12. November 2018 13:45
  • Nur so am Rande: Mit 
    return 
    kannst du Daten von einem Skript an ein anderes übergeben. D.h., du kannst deine beiden Skripte zentral ausführen und brauchst keine csv-Datei, falls alles direkt hintereinander läuft. Siehe folgendes kleines Beispiel aus 3 Skript-Dateien; natürlich kann man auch komplexe Objekte übergeben.
    Main.ps1:
    
    $Daten = & Skript1.ps1
    & Skript2.ps1
    
    
    Skript1.ps1:
    
    return "ABC"
    
    
    
    Skript2.ps1:
    
    param($myParameter)
    Write-Host "Meine Eingabe ist $myParameter"

    Dienstag, 13. November 2018 14:10