Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Bugger

Bugger (Level 1) - Jetzt verbinden

10.10.2014, aktualisiert 14.10.2014, 1627 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 ..
Ähnliche Inhalte
Batch & Shell
Powershell Select
gelöst Frage von shwatsonBatch & Shell5 Kommentare

Hallo Community! Zu meinem Problem, ich habe mir ps1 und eine txt Datei erstellt, und versuche nun mit der ...

Batch & Shell

Powershell multiple Datei-Inhaltssuche und mehrere Unterordner

Frage von Jenny82Batch & Shell3 Kommentare

Hallo zusammen, ich versuche gerade per Powershell Dateien mit bestimmtem Textinhalt in diverse Unterordner zu verschieben und krieg das ...

Datenbanken

SQL Abfrage (Multiple Rows in singleton select)

Frage von Triforce500Datenbanken2 Kommentare

Hallo, ich habe zwei Tabellen (1:N), heißt: auf einen Datensatz in Tabelle A werden zwei Datensätze in Tabelle B ...

Batch & Shell

Powershell select-string -pattern

gelöst Frage von LianenSchwingerBatch & Shell2 Kommentare

Hallo, ich muss auf die schnelle ca. 1000 EDIFACT Dateien auswerten. Dazu versuche ich mich gerade in Powershell einzuarbeiten. ...

Neue Wissensbeiträge
Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 1 StundeWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgborn vor 1 StundeMicrosoft1 Kommentar

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Sicherheit
Microsoft und Skype: Sicherheit
Information von kgborn vor 2 TagenSicherheit

Die Tage gab es ja einige Berichte zur Sicherheit des Skype-Updaters. Der Updater von Skype läuft unter dem Konto ...

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1017 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)13 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall11 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...

Server-Hardware
Server für Exchange 2016, Kaufberatung
Frage von MazenauerServer-Hardware10 Kommentare

Guten Tag werte Gemeinde, Vorab: Ich dachte es gab mal einen separaten Bereich für solche Anfragen, habe ich leider ...