marcimarc85
Goto Top

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:

# 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:

0
Dump Ordner auf Server 1 ist leer
0
Dump Ordner auf Server 2 ist leer

Content-Key: 643450

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

Printed on: April 19, 2024 at 20:04 o'clock

Member: Doskias
Solution Doskias Jan 22, 2021 updated at 09:37:53 (UTC)
Goto Top
Moin, arbeitet wie geplant face-smile

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:

   $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:
 $encryptedPassword=Read-Host "Adminkennwort eingeben"-AsSecureString  
Member: MarciMarc85
MarciMarc85 Jan 22, 2021 at 09:59:53 (UTC)
Goto Top
Hallo Doskias.

Vielen Dank für deine Antwort. Das hat zum Ziel geführt! Ich hab wahrscheinlich schon zu lange an dem Script rumgedoktort, als das ich das hätte selbst rausfinden können ;)
Mitglied: 147323
147323 Jan 22, 2021 updated at 10:15:09 (UTC)
Goto Top
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.
Member: MarciMarc85
MarciMarc85 Jan 29, 2021 at 12:47:11 (UTC)
Goto Top
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
Mitglied: 147323
147323 Jan 29, 2021 updated at 14:40:40 (UTC)
Goto Top
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

Joa brauchst du nur die $computer Variable in deiner IF Prüfung in ein Array schreiben, fertig.

$success = @()
# .....
#...
If ........ {
    $success += $computer
}