Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Powershell Multiple Select Box und Dateien kopieren

Frage Entwicklung Batch & Shell

Mitglied: Bugger

Bugger (Level 1) - Jetzt verbinden

10.10.2014, aktualisiert 14.10.2014, 1375 Aufrufe, 7 Kommentare

Hallo zusammen,

ich möchte gerne über eine Box mehrere Server auswählen und auf diesen sollen dann Dateien kopiert werden. Folgendes Script funktioniert super, allerdings nur, wenn ich nur einen Server auswähle. Was muss ich tun, damit die Werte aus $Script:x einzeln abgearbeitet werden? Danke im Voraus!

01.
  
02.
$Script:x = @() 
03.
 
04.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
05.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
06.
 
07.
$objForm = New-Object System.Windows.Forms.Form  
08.
$objForm.Text = "Data Entry Form" 
09.
$objForm.Size = New-Object System.Drawing.Size(300,200)  
10.
$objForm.StartPosition = "CenterScreen" 
11.
 
12.
$objForm.KeyPreview = $True 
13.
 
14.
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")  
15.
16.
        foreach ($objItem in $objListbox.SelectedItems) 
17.
            {$x += $objItem} 
18.
        $objForm.Close() 
19.
20.
    }) 
21.
 
22.
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")  
23.
    {$objForm.Close()}}) 
24.
 
25.
$OKButton = New-Object System.Windows.Forms.Button 
26.
$OKButton.Location = New-Object System.Drawing.Size(75,120) 
27.
$OKButton.Size = New-Object System.Drawing.Size(75,23) 
28.
$OKButton.Text = "OK" 
29.
 
30.
$OKButton.Add_Click( 
31.
32.
        foreach ($objItem in $objListbox.SelectedItems) 
33.
            {$Script:x += $objItem} 
34.
        $objForm.Close() 
35.
   }) 
36.
 
37.
$objForm.Controls.Add($OKButton) 
38.
 
39.
$CancelButton = New-Object System.Windows.Forms.Button 
40.
$CancelButton.Location = New-Object System.Drawing.Size(150,120) 
41.
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
42.
$CancelButton.Text = "Cancel" 
43.
$CancelButton.Add_Click({$objForm.Close()}) 
44.
$objForm.Controls.Add($CancelButton) 
45.
 
46.
$objLabel = New-Object System.Windows.Forms.Label 
47.
$objLabel.Location = New-Object System.Drawing.Size(10,20)  
48.
$objLabel.Size = New-Object System.Drawing.Size(280,20)  
49.
$objLabel.Text = "Please make a selection from the list below:" 
50.
$objForm.Controls.Add($objLabel)  
51.
 
52.
$objListbox = New-Object System.Windows.Forms.Listbox  
53.
$objListbox.Location = New-Object System.Drawing.Size(10,40)  
54.
$objListbox.Size = New-Object System.Drawing.Size(260,20)  
55.
 
56.
$objListbox.SelectionMode = "MultiExtended" 
57.
 
58.
[void] $objListbox.Items.Add("Server1") 
59.
[void] $objListbox.Items.Add("Server2") 
60.
[void] $objListbox.Items.Add("Server3") 
61.
[void] $objListbox.Items.Add("Server4") 
62.
[void] $objListbox.Items.Add("Server5") 
63.
 
64.
$objListbox.Height = 70 
65.
$objForm.Controls.Add($objListbox)  
66.
$objForm.Topmost = $True 
67.
 
68.
$objForm.Add_Shown({$objForm.Activate()}) 
69.
[void] $objForm.ShowDialog() 
70.
 
71.
copy -Recurse \\Pfad\Dateien\ \\$Script:x\c$\Ziel\ 
72.
 
73.
Write-Host "Fertig" 
74.
 
75.
$y = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
76.
 
Mitglied: colinardo
LÖSUNG 10.10.2014, aktualisiert um 18:58 Uhr
Hallo Bugger,
da du ein Array aus deiner Listbox-Auswahl erstellst, musst du natürlich über alle Elemente mit einer foreach-Schleife (%{} = Abkürzung für Foreach-Object) iterieren (Zeile 71 folgendermaßen ändern):
$script:x | %{copy -Recurse '\\Pfad\Dateien\' "\\$_\c$\Ziel\"}
$_ ist dabei immer die aktuelle Schleifenvariable.

Noch zur Info: Du musst nur aufpassen wenn du Dollarzeichen innerhalb von doppelten Anführungszeichen verwendest. In diesem Fall geht das c$ in Ordnung weil ihm direkt dahinter ein Backslash folgt, wenn aber direkt ein Buchstabe oder Zahl folgt musst du das Dollarzeichen mit Voranstellen eines Backticks (`) escapen, da es sonst als Variable interpretiert wird.

Grüße Uwe

p.s. Bitte nutze Code-Tags für deinen Quellcode: <code> Quellcode </code>. Merci. Kannst du auch nachträglich korrigieren.
Bitte warten ..
Mitglied: Bugger
10.10.2014, aktualisiert um 14:16 Uhr
Super, genau das habe ich gesucht. Funktioniert einwandfrei. Vielen Dank!

Die eigentlich Frage ist zwar gelöst aber ich hätte noch mehr. Wie kann ich denn $_ für weitere Befehle verwenden? So wie unten funktioniert es jedenfalls nicht.^^

01.
function Test-Process{ 
02.
param( 
03.
[string]$procid 
04.
05.
  (get-wmiobject Win32_Process ProcessId -filter "ProcessId=$procid" -ComputerName $_) -ne $NULL 
06.
07.
 
08.
$process = ([WMICLASS]“\\$_\ROOT\CIMV2:win32_process”).Create(“c:\\setup.exe /sAll /rs") 
09.
 
10.
[string]$ID = $process.ProcessID 
11.
Write-Output "Waiting for process $ID to finish on $_" 
12.
while (test-process $process.ProcessId $_) { }  # Wait for terminate
Bitte warten ..
Mitglied: colinardo
10.10.2014, aktualisiert um 19:42 Uhr
Zitat von Bugger:
Die eigentlich Frage ist zwar gelöst aber ich hätte noch mehr. Wie kann ich denn $_ für weitere Befehle verwenden?
So wie unten funktioniert es jedenfalls nicht.^^
sory, habe ich leider nicht rechtzeitig gesehen, das du noch was nachgetragen hast ...das nächste mal in ein neues Kommentar packen damit ich das mitbekomme ...

Du musst das ganze natürlich in das Foreach-Object kapseln.
01.
function Test-Process{ 
02.
param( 
03.
[string]$procid, 
04.
[string]$computer 
05.
06.
  (get-wmiobject Win32_Process ProcessId -filter "ProcessId=$procid" -ComputerName $computer) -ne $NULL 
07.
08.
 
09.
$script:x | %{ 
10.
    copy -Recurse '\\Pfad\Dateien\' "\\$_\c$\Ziel\" 
11.
    $process = ([WMICLASS]“\\$_\ROOT\CIMV2:win32_process”).Create(“c:\\setup.exe /sAll /rs") 
12.
    [string]$ID = $process.ProcessID 
13.
    Write-Output "Waiting for process $ID to finish on $_" 
14.
    while (Test-Process $process.ProcessId $_) { sleep -Milliseconds 200 }  # Wait for terminate 
15.
}
das lässt sich aber natürlich auch ausführlich mit einer normalen foreach() schreiben, wobei du dann anstatt $_ die Variable $server nutzt. Aber aber das kennst du ja deinem Script oben zu urteilen
01.
foreach ($server in $script:x){ 
02.
    copy -Recurse '\\Pfad\Dateien\' "\\$server\c$\Ziel\" 
03.
    $process = ([WMICLASS]“\\$server\ROOT\CIMV2:win32_process”).Create(“c:\\setup.exe /sAll /rs") 
04.
    [string]$ID = $process.ProcessID 
05.
    Write-Output "Waiting for process $ID to finish on $server" 
06.
    while (Test-Process $process.ProcessId $server) { sleep -Milliseconds 200 }  # Wait for terminate 
07.
}
das kannst du selber entscheiden was du nutzen möchtest.

By the way kannst du auch Invoke-Command nutzen um einen Prozess Remote auszuführen, dann brauchst du auch nicht mit deiner Funktion testen ob der Prozess noch läuft Diesem Befehl kannst du auch gleich ein Array an Servernamen übergeben auf denen der Befehl ausgeführt werden soll
$result = Invoke-Command -ComputerName $script:x -ScriptBlock {&'c:\setup.exe' /sAll /rs}
Siehe auch: http://www.howtogeek.com/117192/how-to-run-powershell-commands-on-remot ...

Grüße Uwe
Bitte warten ..
Mitglied: Bugger
14.10.2014, aktualisiert um 10:14 Uhr
Hi,

funktioniert super, vielen Dank! Ich lass es nochmal offen falls, ich noch auf weitere Probleme stoße

Gruß
Bugger
Bitte warten ..
Mitglied: Bugger
14.10.2014 um 12:01 Uhr
Hi,

ein kleines Problemchen hätte ich noch. Ich habe zusätzlich zu der Multiple Box noch ein Textfeld eingebaut, das funktioniert auch, allerdings nicht beides gleichzeitig. Und die Textbox funktioniert nur wenn ich Enter drücke und die Listbox nur wenn ich auf OK klicke:

01.
$Script:x = @() 
02.
 
03.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
04.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
05.
 
06.
$objForm = New-Object System.Windows.Forms.Form  
07.
$objForm.Text = "Auto Installation" 
08.
$objForm.Size = New-Object System.Drawing.Size(300,480)  
09.
$objForm.StartPosition = "CenterScreen" 
10.
 
11.
$objForm.KeyPreview = $True 
12.
 
13.
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")  
14.
15.
        foreach ($objItem in $objListbox.SelectedItems) 
16.
            {$Script:x += $objItem} 
17.
        $objForm.Close() 
18.
19.
    }) 
20.
 
21.
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")  
22.
    {$objForm.Close()}}) 
23.
 
24.
$OKButton = New-Object System.Windows.Forms.Button 
25.
$OKButton.Location = New-Object System.Drawing.Size(75,320) 
26.
$OKButton.Size = New-Object System.Drawing.Size(75,23) 
27.
$OKButton.Text = "OK" 
28.
 
29.
$OKButton.Add_Click( 
30.
31.
        foreach ($objItem in $objListbox.SelectedItems) 
32.
            {$Script:x += $objItem} 
33.
        $objForm.Close() 
34.
   }) 
35.
    
36.
$objForm.Controls.Add($OKButton) 
37.
 
38.
$CancelButton = New-Object System.Windows.Forms.Button 
39.
$CancelButton.Location = New-Object System.Drawing.Size(150,320) 
40.
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
41.
$CancelButton.Text = "Cancel" 
42.
$CancelButton.Add_Click({$objForm.Close()}) 
43.
$objForm.Controls.Add($CancelButton) 
44.
 
45.
$objLabel = New-Object System.Windows.Forms.Label 
46.
$objLabel.Location = New-Object System.Drawing.Size(10,20)  
47.
$objLabel.Size = New-Object System.Drawing.Size(280,20)  
48.
$objLabel.Text = "Server auswählen:" 
49.
$objForm.Controls.Add($objLabel)  
50.
 
51.
$objListbox = New-Object System.Windows.Forms.Listbox  
52.
$objListbox.Location = New-Object System.Drawing.Size(10,40)  
53.
$objListbox.Size = New-Object System.Drawing.Size(260,20)  
54.
 
55.
$objListbox.SelectionMode = "MultiExtended" 
56.
 
57.
[void] $objListbox.Items.Add("Server 1") 
58.
[void] $objListbox.Items.Add("Server 2") 
59.
[void] $objListbox.Items.Add("Server 3") 
60.
 
61.
$objForm.KeyPreview = $True 
62.
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")  
63.
    {$Script:x=$objTextBox.Text;$objForm.Close()}}) 
64.
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")  
65.
    {$objForm.Close()}}) 
66.
 
67.
$objLabel = New-Object System.Windows.Forms.Label 
68.
$objLabel.Location = New-Object System.Drawing.Size(10,360)  
69.
$objLabel.Size = New-Object System.Drawing.Size(280,20)  
70.
$objLabel.Text = "Eigenen Server eintragen - Enter:" 
71.
$objForm.Controls.Add($objLabel)  
72.
	 
73.
$objTextBox = New-Object System.Windows.Forms.TextBox  
74.
$objTextBox.Location = New-Object System.Drawing.Size(10,380)  
75.
$objTextBox.Size = New-Object System.Drawing.Size(260,20)  
76.
$objForm.Controls.Add($objTextBox)  
77.
 
78.
$objListbox.Height = 270 
79.
$objForm.Controls.Add($objListbox)  
80.
$objForm.Topmost = $True 
81.
 
82.
$objForm.Add_Shown({$objForm.Activate()}) 
83.
[void] $objForm.ShowDialog()
Bitte warten ..
Mitglied: colinardo
LÖSUNG 14.10.2014, aktualisiert um 13:18 Uhr
01.
$OKButton.Location = New-Object System.Drawing.Size(75,320) 
02.
$OKButton.Size = New-Object System.Drawing.Size(75,23) 
03.
$OKButton.Text = "OK" 
04.
 
05.
$OKButton.Add_Click({ 
06.
        $Script:x += $objListbox.SelectedItems 
07.
        $objForm.Close() 
08.
   }) 
09.
    
10.
$objForm.Controls.Add($OKButton) 
11.
 
12.
$CancelButton = New-Object System.Windows.Forms.Button 
13.
$CancelButton.Location = New-Object System.Drawing.Size(150,320) 
14.
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
15.
$CancelButton.Text = "Cancel" 
16.
$CancelButton.Add_Click({$objForm.Close()}) 
17.
$objForm.Controls.Add($CancelButton) 
18.
 
19.
$objLabel = New-Object System.Windows.Forms.Label 
20.
$objLabel.Location = New-Object System.Drawing.Size(10,20)  
21.
$objLabel.Size = New-Object System.Drawing.Size(280,20)  
22.
$objLabel.Text = "Server auswählen:" 
23.
$objForm.Controls.Add($objLabel)  
24.
 
25.
$objListbox = New-Object System.Windows.Forms.Listbox  
26.
$objListbox.Location = New-Object System.Drawing.Size(10,40)  
27.
$objListbox.Size = New-Object System.Drawing.Size(260,20)  
28.
 
29.
$objListbox.SelectionMode = "MultiExtended" 
30.
 
31.
[void] $objListbox.Items.Add("Server 1") 
32.
[void] $objListbox.Items.Add("Server 2") 
33.
[void] $objListbox.Items.Add("Server 3") 
34.
 
35.
$objForm.KeyPreview = $True 
36.
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")  
37.
    {$objForm.Close()}}) 
38.
 
39.
$objLabel = New-Object System.Windows.Forms.Label 
40.
$objLabel.Location = New-Object System.Drawing.Size(10,360)  
41.
$objLabel.Size = New-Object System.Drawing.Size(280,20)  
42.
$objLabel.Text = "Eigenen Server eintragen - Enter:" 
43.
$objForm.Controls.Add($objLabel)  
44.
	 
45.
$objTextBox = New-Object System.Windows.Forms.TextBox  
46.
$objTextBox.Location = New-Object System.Drawing.Size(10,380)  
47.
$objTextBox.Size = New-Object System.Drawing.Size(260,20)  
48.
$objForm.Controls.Add($objTextBox)  
49.
 
50.
$objTextBox.Add_KeyPress({ 
51.
if ($_.KeyChar -eq 13) { 
52.
    $objListbox.Items.Add($objTextBox.Text) 
53.
54.
}) 
55.
 
56.
$objListbox.Height = 270 
57.
$objForm.Controls.Add($objListbox)  
58.
$objForm.Topmost = $True 
59.
 
60.
$objForm.Add_Shown({$objForm.Activate()}) 
61.
[void] $objForm.ShowDialog() 
62.
 
63.
write-host "Gewählte Server:" -ForegroundColor Green 
64.
$script:x
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Bitte warten ..
Mitglied: Bugger
14.10.2014 um 13:18 Uhr
Ja, ich glaube das war es dann.^^ Ich hatte es mir anders vorgestellt aber deine Lösung gefällt mir noch besser Vielen vielen Dank!

Gruß
Bugger
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(2)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (10)

Frage von 1410640014 zum Thema Backup ...