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-Key: 264388

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

Printed on: April 24, 2024 at 06:04 o'clock

Member: colinardo
colinardo Feb 24, 2015 updated at 12:52:45 (UTC)
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
Member: Bugger
Bugger Feb 24, 2015 at 15:19:07 (UTC)
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.
Member: colinardo
colinardo Feb 24, 2015 updated at 15:56:54 (UTC)
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 !
Member: Bugger
Bugger Feb 26, 2015 at 09:47:10 (UTC)
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
Member: colinardo
colinardo Feb 26, 2015 updated at 09:58:05 (UTC)
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
Member: Bugger
Bugger Feb 26, 2015 updated at 10:52:46 (UTC)
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.
Member: colinardo
colinardo Feb 26, 2015 updated at 11:00:00 (UTC)
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 ...
Member: Bugger
Bugger Feb 26, 2015 updated at 11:52:25 (UTC)
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.^^
Member: colinardo
colinardo Feb 26, 2015 updated at 11:51:20 (UTC)
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.
Member: Bugger
Bugger Feb 26, 2015 at 12:46:26 (UTC)
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.
Member: colinardo
Solution colinardo Feb 26, 2015 updated at 14:21:08 (UTC)
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
Member: Bugger
Bugger Feb 26, 2015 at 14:20:45 (UTC)
Goto Top
Oh ja, jetzt funktionierts.Danke face-smile
Falls es dich tröstet, ich habe es jetzt auch verstanden.


Gruß
Bugger