bugger
Goto Top

Powershell Remote HDD Speicher auslesen

Hallo,

ich habe folgenden Befehl:
gwmi win32_logicaldisk -Computer $server -filter "drivetype=3" |  
select @{n="Server";e={$server}},DeviceID,VolumeName,@{Name="Size";Expression={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}} | Out-GridView  

Der funktioniert auch nur wird für jeden Server ein eigenes ogv Fenster geöffnet. Ich hätte gerne, dass alle Server in einem Fenster dargestellt werden. Die Auswahl der Server erfolgt über eine Listbox.

Gruß
Bugger

Content-ID: 264388

Url: https://administrator.de/contentid/264388

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

colinardo
colinardo 24.02.2015 aktualisiert um 13:52:45 Uhr
Goto Top
Hallo Bugger,
du packst deine Objekte einfach zusammen in ein Array. Beispiel:
$arr = @()
$servers = @("ServerA","ServerB","ServerC")  
foreach($server in $servers){
    $arr += (gwmi win32_logicaldisk -Computer $server -filter "drivetype=3" | select @{n="Server";e={$server}},DeviceID,VolumeName,@{Name="Size";Expression={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}})  
}
$arr | ogv
Grüße Uwe
Bugger
Bugger 24.02.2015 um 16:19:07 Uhr
Goto Top
Aber das ist schon in einem Array und bei den anderen Befehlen funktioniert es. Server = etc. würde auch nicht funktionieren, da die Auswahl ja über eine GUI mit Listbox erfolgt.
colinardo
colinardo 24.02.2015 aktualisiert um 16:56:54 Uhr
Goto Top
Zitat von @Bugger:
Aber das ist schon in einem Array und bei den anderen Befehlen funktioniert es. Server = etc. würde auch nicht funktionieren,
da die Auswahl ja über eine GUI mit Listbox erfolgt.
Du hast mich falsch verstanden .... schau dir den Code doch erst mal genau an face-wink / die Server sind nur als Beispiel eingefügt ... ich meine die Daten des selects !
Bugger
Bugger 26.02.2015 um 10:47:10 Uhr
Goto Top
Ne, sorry. Ich verstehs nicht.^^ Und was nach select kommt ist auch identisch. Ich will ein Help kaufen und bitte um Auflösung face-smile
colinardo
colinardo 26.02.2015 aktualisiert um 10:58:05 Uhr
Goto Top
Zitat von @Bugger:
Ne, sorry. Ich verstehs nicht.^^ Und was nach select kommt ist auch identisch.
Die Daten werden als Object in ein weiteres Array gepackt (arr) bzw. damit zusammengefasst und erst zum Schluss an OGV gepiped !!
Ich will ein Help kaufen und bitte um Auflösung face-smile
Sorry, aber dann beschreibe dein Vorhaben besser .. das tut hie nämlich das von dir "wage" beschriebene !! face-sad
Bugger
Bugger 26.02.2015 aktualisiert um 11:52:46 Uhr
Goto Top
Dein Script alleine funktioniert, nur bei meinem Script halt nicht. Dachte halt nicht das es so kompliziert sei.

So siehts es im Grunde aus:
foreach ($server in $script:x){

    if ( $checkHDD.Checked -eq $true )
        {
gwmi win32_logicaldisk -Computer $server -filter "drivetype=3" |  
select @{n="Server";e={$server}},DeviceID,VolumeName,@{Name="Size";Expression={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}} | Out-GridView  
        }

Wenn ich jetzt den part in { } mit deinem ersetze funktioniert es leider nicht.
colinardo
colinardo 26.02.2015 aktualisiert um 12:00:00 Uhr
Goto Top
Du hast ja auch die Hälfte des obigen Scripts vergessen ! Wo erstellst du bitteschön arr ?? Und du fügst das Ergebnis des Servers nicht dem Array arr hinzu ! Das ist essentiell damit das ganze funktioniert. Du hast nur eine Hirnblockade ...
Bugger
Bugger 26.02.2015 aktualisiert um 12:52:25 Uhr
Goto Top
Ja, falsch kopiert -.-

    if ( $checkHDD.Checked -eq $true )
        {
$arr = @()
$servers = @("Server1","Server2")  
foreach($server in $servers){
    $arr += (gwmi win32_logicaldisk -Computer $server -filter "drivetype=3" | select @{n="Server";e={$server}},DeviceID,VolumeName,@{Name="Size";Expression={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}})  
    }
$arr | ogv
}

Das mit den $servers ist mir noch nicht ganz klar und zu deiner Hinrblockade - ja absolut, wird zeit das die Woche um ist.^^
colinardo
colinardo 26.02.2015 aktualisiert um 12:51:20 Uhr
Goto Top
Neinnnnnnnnnn....
Meine Servers Schleife diente nur zu einer funktionsfähigen Demo damit es ausprobiert werden kann !!!!!!! Die bindest du natürlich nicht mit ein die hast du ja selber schon !
Dein Aufbau ist falsch. Nach deinen dürftigen Schnippseln von oben sieht das so aus
$arr = @()
foreach ($server in $script:x){
    if ( $checkHDD.Checked -eq $true ){
        $arr += (gwmi win32_logicaldisk -Computer $server -filter "drivetype=3" | select @{n="Server";e={$server}},DeviceID,VolumeName,@{Name="Size";Expression={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}})  
    }
}
$arr | ogv
Der Sinn dahinter ist einfach. Das Array $arr dient dazu die Objekte der Server in einem Array gebündelt zu sammeln. Das hinzufügen zum Array geschieht mit dem Zuweisungsoperator +=. Erst nachdem die Schleife fertig ist wird dann das Array an Out-GridView gepiped.
Das sollte nun aber verständlich genug gewesen sein.
Bugger
Bugger 26.02.2015 um 13:46:26 Uhr
Goto Top
Ok, ich hole mal weiter aus damit wird vielleicht manches klarer. Das ist (teilweise) mein Script:

write-host "Loading..." -ForegroundColor Red  

$Script:x = @()

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Gui"  
$objForm.Size = New-Object System.Drawing.Size(475,450) 
$objForm.StartPosition = "CenterScreen"  

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(100,20) 
$objLabel.Text = "Server auswählen:"  
$objForm.Controls.Add($objLabel) 

$objListbox = New-Object System.Windows.Forms.Listbox 
$objListbox.Location = New-Object System.Drawing.Size(10,40) 
$objListbox.Size = New-Object System.Drawing.Size(180,20) 

$objListbox.SelectionMode = "MultiExtended"  

[void] $objListbox.Items.Add("Server1")  
[void] $objListbox.Items.Add("Server2")  


$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")   
    {$objForm.Close()}})

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(320,20) 
$objLabel.Size = New-Object System.Drawing.Size(130,20) 
$objLabel.Text = "Software deinstallieren:"  
$objForm.Controls.Add($objLabel)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(320,210) 
$objLabel.Size = New-Object System.Drawing.Size(130,20) 
$objLabel.Text = "Tools:"  
$objForm.Controls.Add($objLabel)

############################################## Start check boxes

$checkFirefoxUn = New-Object System.Windows.Forms.checkbox
$checkFirefoxUn.Location = New-Object System.Drawing.Size(325,40)
$checkFirefoxUn.Size = New-Object System.Drawing.Size(100,20)
$checkFirefoxUn.Text = "Firefox"  
$checkFirefoxUn.Checked = $false
$objForm.Controls.Add($checkFirefoxUn)

$checkHDD = New-Object System.Windows.Forms.checkbox
$checkHDD.Location = New-Object System.Drawing.Size(325,230)
$checkHDD.Size = New-Object System.Drawing.Size(120,20)
$checkHDD.Text = "HDD Platz prüfen"  
$checkHDD.Checked = $false
$objForm.Controls.Add($checkHDD)

############################################## end check boxes



$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,310) 
$objLabel.Size = New-Object System.Drawing.Size(140,30) 
$objLabel.Text = "Eigenen Server eintragen xxx - Enter:"  
$objForm.Controls.Add($objLabel) 
	
$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,340) 
$objTextBox.Size = New-Object System.Drawing.Size(180,20) 
$objForm.Controls.Add($objTextBox) 

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(20,370)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"  
$objForm.Controls.Add($OKButton)

$OKButton.Add_Click({
        $Script:x += $objListbox.SelectedItems
        $objForm.Close()
   })

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(110,370)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"  
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objTextBox.Add_KeyPress({
if ($_.KeyChar -eq 13) {
    $objListbox.Items.Add($objTextBox.Text)
   }
})

$objListbox.Height = 270
$objForm.Controls.Add($objListbox) 


############################################## End Functions

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

write-host "Gewählte Server:" -ForegroundColor Green  
$script:x

foreach ($server in $script:x){

############################################## Deinstallation

	if ( $checkFirefoxUn.Checked -eq $true )
		{
            if (Test-Path -path "\\$server\c$\Program Files (x86)\")  
            {
    Write-Output "Deinstalliere Firefox..."  
	$process9 = ([WMICLASS]"\\$server\ROOT\CIMV2:win32_process").Create("C:\Program Files (x86)\Mozilla Firefox\uninstall\helper.exe -ms")  
    [string]$ID = $process9.ProcessID
    Write-Output "Waiting for process $ID to finish Firefox on $server"  
    while (Test-Process $process9.ProcessId $server) { sleep -Milliseconds 200 }  # Wait for terminate
            }
            else 
			{
    Write-Output "Deinstalliere Firefox..."  
	$process9 = ([WMICLASS]"\\$server\ROOT\CIMV2:win32_process").Create("C:\Programme (x86)\Mozilla Firefox\uninstall\helper.exe -ms")  
    [string]$ID = $process9.ProcessID
    Write-Output "Waiting for process $ID to finish Firefox on $server"  
    while (Test-Process $process9.ProcessId $server) { sleep -Milliseconds 200 }  # Wait for terminate
            }
        }

$arr = @()
foreach ($server in $script:x){
    if ( $checkHDD.Checked -eq $true ){
        $arr += (gwmi win32_logicaldisk -Computer $server -filter "drivetype=3" | select @{n="Server";e={$server}},DeviceID,VolumeName,@{Name="Size";Expression={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}})  
    }
}
$arr | ogv

}

Unter Server eintragen kannst du jetzt zweimal deinen Rechner eintragen und wenn du dann beide auswählst, den entsprechenden Haken setzt und auf OK drückst, gehen zwei ogv Fenster auf.
colinardo
Lösung colinardo 26.02.2015 aktualisiert um 15:21:08 Uhr
Goto Top
gehen zwei ogv Fenster auf.
Weil du es wieder alles verdoppelt hast face-sad !!!!!!!!!!!! Das habe ich doch oben extra geschrieben. Und du hast es wieder doppelt gemoppelt gemacht .... Du hast zwei verschachtelte Schleifen erzeugt !

  • Zeile 136 kommt vor Zeile 112
  • Die Foreach-Schleife in Zeile 137 kommt weg
  • und Zeile 142 muss außerhalb deiner Server-Schleife also hinter Zeile 144 stehen

write-host "Loading..." -ForegroundColor Red  

$Script:x = @()

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "Gui"  
$objForm.Size = New-Object System.Drawing.Size(475,450) 
$objForm.StartPosition = "CenterScreen"  

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(100,20) 
$objLabel.Text = "Server auswählen:"  
$objForm.Controls.Add($objLabel) 

$objListbox = New-Object System.Windows.Forms.Listbox 
$objListbox.Location = New-Object System.Drawing.Size(10,40) 
$objListbox.Size = New-Object System.Drawing.Size(180,20) 

$objListbox.SelectionMode = "MultiExtended"  

[void] $objListbox.Items.Add("Server1")  
[void] $objListbox.Items.Add("Server2")  


$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")   
    {$objForm.Close()}})

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(320,20) 
$objLabel.Size = New-Object System.Drawing.Size(130,20) 
$objLabel.Text = "Software deinstallieren:"  
$objForm.Controls.Add($objLabel)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(320,210) 
$objLabel.Size = New-Object System.Drawing.Size(130,20) 
$objLabel.Text = "Tools:"  
$objForm.Controls.Add($objLabel)

############################################## Start check boxes

$checkFirefoxUn = New-Object System.Windows.Forms.checkbox
$checkFirefoxUn.Location = New-Object System.Drawing.Size(325,40)
$checkFirefoxUn.Size = New-Object System.Drawing.Size(100,20)
$checkFirefoxUn.Text = "Firefox"  
$checkFirefoxUn.Checked = $false
$objForm.Controls.Add($checkFirefoxUn)

$checkHDD = New-Object System.Windows.Forms.checkbox
$checkHDD.Location = New-Object System.Drawing.Size(325,230)
$checkHDD.Size = New-Object System.Drawing.Size(120,20)
$checkHDD.Text = "HDD Platz prüfen"  
$checkHDD.Checked = $false
$objForm.Controls.Add($checkHDD)

############################################## end check boxes



$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,310) 
$objLabel.Size = New-Object System.Drawing.Size(140,30) 
$objLabel.Text = "Eigenen Server eintragen xxx - Enter:"  
$objForm.Controls.Add($objLabel) 
	
$objTextBox = New-Object System.Windows.Forms.TextBox 
$objTextBox.Location = New-Object System.Drawing.Size(10,340) 
$objTextBox.Size = New-Object System.Drawing.Size(180,20) 
$objForm.Controls.Add($objTextBox) 

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(20,370)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"  
$objForm.Controls.Add($OKButton)

$OKButton.Add_Click({
        $Script:x += $objListbox.SelectedItems
        $objForm.Close()
   })

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(110,370)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"  
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objTextBox.Add_KeyPress({
if ($_.KeyChar -eq 13) {
    $objListbox.Items.Add($objTextBox.Text)
   }
})

$objListbox.Height = 270
$objForm.Controls.Add($objListbox) 


############################################## End Functions

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

write-host "Gewählte Server:" -ForegroundColor Green  
$script:x

$arr = @()
foreach ($server in $script:x){
############################################## Deinstallation

	if ( $checkFirefoxUn.Checked -eq $true )
		{
            if (Test-Path -path "\\$server\c$\Program Files (x86)\")  
            {
    Write-Output "Deinstalliere Firefox..."  
	$process9 = ([WMICLASS]"\\$server\ROOT\CIMV2:win32_process").Create("C:\Program Files (x86)\Mozilla Firefox\uninstall\helper.exe -ms")  
    [string]$ID = $process9.ProcessID
    Write-Output "Waiting for process $ID to finish Firefox on $server"  
    while (Test-Process $process9.ProcessId $server) { sleep -Milliseconds 200 }  # Wait for terminate
            }
            else 
			{
    Write-Output "Deinstalliere Firefox..."  
	$process9 = ([WMICLASS]"\\$server\ROOT\CIMV2:win32_process").Create("C:\Programme (x86)\Mozilla Firefox\uninstall\helper.exe -ms")  
    [string]$ID = $process9.ProcessID
    Write-Output "Waiting for process $ID to finish Firefox on $server"  
    while (Test-Process $process9.ProcessId $server) { sleep -Milliseconds 200 }  # Wait for terminate
            }
        }


    if ( $checkHDD.Checked -eq $true ){
        $arr += (gwmi win32_logicaldisk -Computer $server -filter "drivetype=3" | select @{n="Server";e={$server}},DeviceID,VolumeName,@{Name="Size";Expression={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}})  
    }
}
$arr | ogv
Man man man, echt schwere Geburt mit dir... I'm out now

Grüße Uwe
Bugger
Bugger 26.02.2015 um 15:20:45 Uhr
Goto Top
Oh ja, jetzt funktionierts.Danke face-smile
Falls es dich tröstet, ich habe es jetzt auch verstanden.


Gruß
Bugger