Powershell- Ordner auf Remote-PCs auf Inhalt prüfen
Ich versuche nun schon seit Ewigkeiten ein Script zum Laufen zu bekommen:
Ich möchte Denselben Ordner, den es auf allen definierten Computern gibt, auf den Inhgalt von Dateien prüfen. Wenn der Ordner Dateien beinhaltet, sollen diese auf den lokalen Computer kopiert werden und auf dem Quellsystem gelöscht werden. Auf dem lokalen System sollen dann die Dateien gezipped werden.
Falls auf keinem Der Computer Dateien in den Ordnen sind, dann soll auch keine Zip-Datei mit leerem Inhalt erstellt werden.
Ich scheitere einzig daran, dass das Überprüfen der Ordnerinhalte auf den Serven in der Schleife nicht funktioniert. Egal, ob Dateien im Ordner sind, oder nicht, ich bekomme immer "0" Dateien als Ergebnis:
Server 1 und Server 2 haben jeweils eine Datei (zum Testen) in diesem Ordner. Das Script gibt aber folgendes aus:
Ich möchte Denselben Ordner, den es auf allen definierten Computern gibt, auf den Inhgalt von Dateien prüfen. Wenn der Ordner Dateien beinhaltet, sollen diese auf den lokalen Computer kopiert werden und auf dem Quellsystem gelöscht werden. Auf dem lokalen System sollen dann die Dateien gezipped werden.
Falls auf keinem Der Computer Dateien in den Ordnen sind, dann soll auch keine Zip-Datei mit leerem Inhalt erstellt werden.
Ich scheitere einzig daran, dass das Überprüfen der Ordnerinhalte auf den Serven in der Schleife nicht funktioniert. Egal, ob Dateien im Ordner sind, oder nicht, ich bekomme immer "0" Dateien als Ergebnis:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Specify computer name(s)
$computernames= "Server1","Server2"
# Set credentials
$adminUsername='domain\administrator'
$plaintextPassword='password'
$encryptedPassword=ConvertTo-securestring $plaintextPassword -AsPlainText -Force
$adminCredential=New-Object -TypeName System.Management.Automation.PSCredential -Args $adminUsername,$encryptedPassword
$datestamp=Get-Date -Format dd_MM_yyyy
# Collect all Dump files from the servers and delete them
foreach ($computer in $computernames){
$session = New-PSSession –ComputerName $computer -Credential $adminCredential
Invoke-Command -ComputerName $computer -Credential $adminCredential -ScriptBlock {$directoryInfo = Get-ChildItem "D:\dumpfiles" -force | Measure-Object }
$directoryInfo.count
if ($directoryInfo.count -ne 0){
$destination_folder= $datestamp+"\"+$computer
$destination_path= "D:\temp\DUMPFILES\"+$destination_folder
if (!(Test-Path $destination_path))
{
New-Item -itemType Directory -Path D:\temp\tomcat_heap_dumps -Name $destination_folder
}
else
{
write-host "Folder already exists"
}
Copy-Item -force -Recurse –FromSession $session -Path 'D:\dumpfiles\*.*' -Destination $destination_path
Invoke-Command -ComputerName $computer -Credential $adminCredential -ScriptBlock {Remove-Item "D:\dumpfiles\*"}
$session | Remove-PSSession
} else{
Write-Host "Dump Ordner auf $computer ist leer"
}
}
Server 1 und Server 2 haben jeweils eine Datei (zum Testen) in diesem Ordner. Das Script gibt aber folgendes aus:
1
2
3
4
2
3
4
0
Dump Ordner auf Server 1 ist leer
0
Dump Ordner auf Server 2 ist leer
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 643450
Url: https://administrator.de/forum/powershell-ordner-auf-remote-pcs-auf-inhalt-pruefen-643450.html
Ausgedruckt am: 14.04.2025 um 12:04 Uhr
5 Kommentare
Neuester Kommentar
Moin, arbeitet wie geplant 
Du machst in Zeile 17 in Invoke-command mit einem Befehl. $directoryInfo wird dann auf dem Rechner gespeichert wo das invoke-command durchgeführt wird. In Zeile 18 rufst du dann lokal auf und lokal ist der Wert dann leer bzw. 0. versuch mal in Zeile 17 und 18:
Damit führst du den Befehl entfernt aus und speicherst das Ergebnis lokal in der Variablen.
Gruß
Doskias
Nachtrag: Zeile 7 gehört sich nicht und Zeile 8 sollte dann so heißen:
Du machst in Zeile 17 in Invoke-command mit einem Befehl. $directoryInfo wird dann auf dem Rechner gespeichert wo das invoke-command durchgeführt wird. In Zeile 18 rufst du dann lokal auf und lokal ist der Wert dann leer bzw. 0. versuch mal in Zeile 17 und 18:
1
2
2
$directoryInfo=Invoke-Command -ComputerName $computer -Credential $adminCredential -ScriptBlock { Get-ChildItem "D:\dumpfiles" -force | Measure-Object }
$directoryInfo.count
Damit führst du den Befehl entfernt aus und speicherst das Ergebnis lokal in der Variablen.
Gruß
Doskias
Nachtrag: Zeile 7 gehört sich nicht und Zeile 8 sollte dann so heißen:
1
$encryptedPassword=Read-Host "Adminkennwort eingeben"-AsSecureString

Dagegen hilft Grundlagen-Handbuch lesen 😉
About Scopes
Btw. Das New-PsSession ist doppelt gemoppelt und überflüssig weil du die Credentials schon separat an Invoke-Command übergibst. Wenn mit New-Pssession dann übergibst du Invoke-Command die Session über den dafür vorgesehenen Parameter und lässt die Credentials weg, denn so wie jetzt baust du immer wieder neue Verbindungen auf und das kostet enorm Zeit.
About Scopes
Btw. Das New-PsSession ist doppelt gemoppelt und überflüssig weil du die Credentials schon separat an Invoke-Command übergibst. Wenn mit New-Pssession dann übergibst du Invoke-Command die Session über den dafür vorgesehenen Parameter und lässt die Credentials weg, denn so wie jetzt baust du immer wieder neue Verbindungen auf und das kostet enorm Zeit.

Zitat von @MarciMarc85:
Danke für die Tipps!
Eine Frage hätte ich dann noch. Ich habe noch eine funktion eingebaut, dass Am Ende eine E-Mail gesendet wird, dass eine neue Datei auf dem FTP Server liegt (inkl. dem Dateinamen).
Bekommt man es irgendwie hin, die Server IP's auf denen Dateien zum synchronisieren gefunden wurden in den Betraff der Mail zu schreiben?
Also im Prinzip benötige ich nur eine neue Variable, die alle Server hintereinander auflistet, bei denen if ($directoryInfo.count -ne 0) zutrifft
Danke für die Tipps!
Eine Frage hätte ich dann noch. Ich habe noch eine funktion eingebaut, dass Am Ende eine E-Mail gesendet wird, dass eine neue Datei auf dem FTP Server liegt (inkl. dem Dateinamen).
Bekommt man es irgendwie hin, die Server IP's auf denen Dateien zum synchronisieren gefunden wurden in den Betraff der Mail zu schreiben?
Also im Prinzip benötige ich nur eine neue Variable, die alle Server hintereinander auflistet, bei denen if ($directoryInfo.count -ne 0) zutrifft
Joa brauchst du nur die $computer Variable in deiner IF Prüfung in ein Array schreiben, fertig.
1
2
3
4
5
6
2
3
4
5
6
$success = @()
# .....
#...
If ........ {
$success += $computer
}