Systemadministratoren müssen täglich verschiedene Standardvorgänge für die zahlreichen Dateien und Ordner auf ihren Windows-Servern ausführen. Zu diesen Aufgaben gehören häufig die Verwaltung der Daten von Benutzern auf freigegebenen Ressourcen und die ordnungsgemäße Sicherung von Daten. Mit PowerShell können Sie die damit verbundene manuelle Arbeit verringern.
In diesem Artikel erfahren Sie, wie Sie PowerShell für diese Aufgaben verwenden:
- Anzeigen von Objekten in einem Verzeichnis
- Erstellen von Dateien und Ordnern
- Löschen von Dateien und Ordnern
- Kopieren von Dateien und Ordnern
- Verschieben von Dateien oder Verzeichnissen
- Umbenennen von Dateien
- Ändern von Dateierweiterungen
Stellen Sie zunächst sicher, dass die Richtlinie Ihres Systems das Ausführen von PowerShell-Skripts erlaubt. Eine Anleitung hierzu finden Sie im Tutorial zur Skripterstellung mit Windows PowerShell für Einsteiger.
Anzeigen von Objekten in einem Verzeichnis
Um den Inhalt eines Verzeichnisses auf einem Windows-Dateiserver anzuzeigen, verwenden Sie das Cmdlet „Get-ChildItem“. Um alle verborgenen Dateien anzuzeigen, fügen Sie den Parameter „-Force“ hinzu. Mit dem Befehl unten werden alle Stammobjekte im Ordner „Shared“ angezeigt:
Get-ChildItem -Force \\fs\Shared
Wenn Sie außerdem auch alle Unterordner und deren Inhalt aufführen möchten, fügen Sie den Parameter „-Recurse“ hinzu:
Get-ChildItem -Force \\fs\Shared -Recurse
Um die Ausgabe zu filtern, fügen Sie die Parameter „Filter“, „Exclude“, „Include“ und „Path“ zum Cmdlet „Get-ChildItem“ hinzu. Eine erweiterte Objektfilterung ist mit dem Cmdlet „Where-Object“ möglich. Das Skript unten sucht nach allen ausführbaren Dateien in dem Ordner „IT“, die nach dem 1. April 2018 geändert wurden:
Get-ChildItem -Path \\fs\Shared\IT -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt '2018-04-01')}
Erstellen von Dateien und Ordnern mit PowerShell
Für die Erstellung neuer Objekte mit Windows PowerShell können Sie das Cmdlet „New-Item“ verwenden und die Art des Objekts festlegen, das Sie erstellen möchten (z. B. ein Verzeichnis, eine Datei oder einen Registrierungsschlüssel).
Mit diesem Befehl wird beispielsweise ein Ordner erstellt:
New-Item -Path '\\fs\Shared\NewFolder' -ItemType Directory
Und mit diesem Befehl wird eine leere Datei erstellt:
New-Item -Path '\\fs\Shared\NewFolder\newfile.txt' -ItemType File
Erstellen von Dateien und Schreiben von Daten in eine Datei
Es stehen mindestens zwei integrierte Methoden für das Erstellen von Dateien und das Schreiben von Daten in diese Dateien zur Verfügung. Sie können das Cmdlet „Out-File“ verwenden:
$text = 'Hello World!' | Out-File $text -FilePath C:\data\text.txt
Um eine vorhandene Datei zu überschreiben, verwenden Sie den Switch-Parameter „-Force“.
Sie können Dateien außerdem mit dem Cmdlet „Export-Csv“ erstellen. Damit wird die Ausgabe in eine csv-Datei exportiert, die in Excel geöffnet werden kann:
Get-ADuser -Filter * | Export-Csv -Path C:\data\ADusers.csv
Erstellen von Dateien nach der Überprüfung, ob sie bereits vorhanden sind
Das folgende Skript überprüft, ob die Datei „pc.txt“ in einem bestimmten Ordner bereits vorhanden ist; ist dies nicht der Fall, wird eine Liste aller AD-Computer erzeugt und in einer neuen Datei mit dem Namen „pc.txt“ gespeichert:
#create array of text files $files=Get-ChildItem C:\data\*.txt | select -expand fullname #check if file exists inside the array $files -match "pc.txt" #if matching return “True” key then exit, if “False” then create a report if($files -eq 'False'){ Get-ADComputer -Filter * | Export-Csv -Path C:\data\pc.txt } else{exit}
Löschen von Dateien und Ordnern mit PowerShell
Für das Löschen von Objekten verwenden Sie das Cmdlet „Remove-Item“. Beachten Sie bitte, dass Sie den Löschvorgang bestätigen müssen, wenn das Objekt nicht leer ist. Das Beispiel unten veranschaulicht, wie Sie den Ordner „IT“ und alle darin enthaltenen Unterordner und Dateien löschen:
Remove-Item -Path '\\fs\shared\it\' Confirm The item at \\pdc\shared\it has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Wenn Sie sich bereits vergewissert haben, dass alle Objekte in dem Ordner ebenfalls gelöscht werden sollen, können Sie den Schritt zur Bestätigung des Löschvorgangs mit dem Switch „-Recurse“ überspringen:
Remove-Item -Path '\\fs\shared\it\' -Recurse
Löschen von Dateien und Ordnern, die älter als X Tage sind
Von Zeit zu Zeit ist es erforderlich, ältere Dateien aus einem bestimmten Verzeichnis zu löschen. So gehen Sie dabei vor:
$Folder = "C:\Backups" #delete files older than 30 days Get-ChildItem $Folder -Recurse -Force -ea 0 | ? {!$_.PsIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays(-30)} | ForEach-Object { $_ | del -Force $_.FullName | Out-File C:\log\deletedbackups.txt -Append } #delete empty folders and subfolders if any exist Get-ChildItem $Folder -Recurse -Force -ea 0 | ? {$_.PsIsContainer -eq $True} | ? {$_.getfiles().count -eq 0} | ForEach-Object { $_ | del -Force $_.FullName | Out-File C:\log\deletedbackups.txt -Append }
Löschen von Dateien nach der Überprüfung, ob sie bereits vorhanden sind
So überprüfen Sie, ob eine Datei vorhanden ist, und löschen diese:
$FileName = 'C:\data\log.txt' If (Test-Path $FileName){ Remove-Item $FileName }
Löschen von Dateien auf mehreren Computern mit einem Skript
Um Dateien auf Remote-PCs zu löschen, benötigen Sie die entsprechenden Sicherheitsberechtigungen für den Zugriff auf diese Dateien. Stellen Sie sicher, dass Sie die UNC-Pfade verwenden, damit das Skript die Dateispeicherorte richtig auflöst.
$filelist = @(" \c$\Temp", "\c$\Backups") #variable to delete files and folder $computerlist = Get-Content C:\data\pc.txt #get list of remote pc's foreach ($computer in $computerlist){ foreach ($file in $filelist){ $filepath= Join-Path "\\$computer\" "$filelist" #generate unc paths to files or folders if (Test-Path $filepath) { Remove-Item $filepath -force -recurse -ErrorAction Continue}}}
Kopieren von Dateien und Ordnern mit PowerShell
Mit dem Cmdlet „Copy-Item“ können Sie Objekte an einen anderen Pfad kopieren. Mit dem folgenden Befehl wird ein Backup erstellt, indem die Datei „users.xlsx“ von einem Remote-Computer (fs) über das Netzwerk auf einen anderen Computer (fs2) kopiert wird:
Copy-Item -Path \\fs\Shared\it\users.xlsx -Destination \\fs2\Backups\it\users.xlsx
Ist die Zieldatei bereits vorhanden, wird der Kopiervorgang abgebrochen. Um die vorhandene Datei zu überschreiben, selbst wenn sie schreibgeschützt ist, verwenden Sie den Parameter „-Force“:
Copy-Item -Path \\fs\Shared\it\users.xlsx -Destination \\fs2\Backups\it\users.xlsx -Force
Kopieren von Dateien auf einen oder von einem Remote-Computer mit PowerShell
Wenn Sie Dateien auf einen oder von einem Remote-Computer kopieren, müssen Sie die UNC-Pfade verwenden.
Mit diesem Befehl können Sie beispielsweise Dateien von einem Remote-Dateiserver in das lokale Verzeichnis „C:“ kopieren:
Copy-Item \\fs\c$\temp -Recurse C:\data\
Um Dateien aus Ihrem lokalen Verzeichnis in den Remote-Ordner zu kopieren, kehren Sie die Quell- und Zielpfade einfach um:
Copy-Item C:\data\ -Recurse \\fs\c$\temp
Kopieren mehrerer Dateien auf einen anderen Server über das Netzwerk mit einem Skript
Sie können auch Dateien von einem Remote-Server auf einen anderen kopieren. Mit dem folgenden Skript werden Kopien des Ordners „\\fs\Shared\temp“ rekursiv in das Verzeichnis „\\fs\Shared\test“ kopiert:
Copy-Item \\fs\Shared\temp -Recurse \\fs\Shared\test
Kopieren ausschließlich bestimmter Dateitypen
Um nur bestimmte Dateien vom Quell- in das Zielverzeichnis zu kopieren, verwenden Sie den Parameter „-Filter“. Mit dem folgenden Befehl werden beispielsweise ausschließlich txt-Dateien von einem Ordner in einen anderen kopiert:
Copy-Item -Filter *.txt -Path \\fs\Shared\it -Recurse -Destination \\fs2\Shared\text
Kopieren von Dateien mit den Befehlen „XCOPY“ und „ROBOCOPY“ oder COM-Objekten
Für das Kopieren von Dateien können Sie auch die Befehle „XCOPY“ und „ROBOCOPY“ ausführen oder wie im Beispiel unten COM-Objekte verwenden:
(New-Object -ComObject Scripting.FileSystemObject).CopyFile('\\fs\Shared', 'fs2\Backup')
Verschieben von Dateien und Ordnern mit PowerShell
Mit dem Cmdlet „Move-Item“ werden Objekte einschließlich ihrer Eigenschaften, Inhalte und untergeordneten Objekte in ein anderes Verzeichnis kopiert. Sie können damit auch eine Datei oder ein Unterverzeichnis an einen anderen Speicherort verschieben.
Mit dem folgenden Befehl wird eine bestimmte Backup-Datei in ein anderes Verzeichnis verschoben:
Move-Item -Path \\fs\Shared\Backups\1.bak -Destination \\fs2\Backups\archive\1.bak
Mit diesem Skript wird der gesamte Ordner „Backups“ mit seinem Inhalt an einen anderen Speicherort verschoben:
Move-Item -Path \\fs\Shared\Backups -Destination \\fs2\Backups\archive
Das Verzeichnis „Backups“ und alle darin enthaltenen Dateien und Unterordner werden dann im Verzeichnis „archive“ angezeigt.
Umbenennen von Dateien mit PowerShell
Mit dem Cmdlet „Rename-Item“ können Sie den Namen eines Objekts ändern. Der Inhalt des Objekts bleibt dabei intakt. Es ist nicht möglich, Objekte mit dem Befehl „Rename-Item“ zu verschieben. Hierfür sollten Sie wie oben beschrieben das Cmdlet „Move-Item“ verwenden.
Mit dem folgenden Befehl können Sie eine Datei umbenennen:
Rename-Item -Path "\\fs\Shared\temp.txt" -NewName "new_temp.txt"
Umbenennen mehrerer Dateien
Um mehrere Dateien gleichzeitig umzubenennen, verwenden Sie folgendes Skript:
$files = Get-ChildItem -Path C:\Temp #create list of files foreach ($file in $files) { $newFileName=$file.Name.Replace("A","B") #replace "A" with "B" Rename-Item $file $newFileName }
Ändern von Dateierweiterungen mit PowerShell
Mit dem Cmdlet „Rename-Item“ können Sie auch Dateierweiterungen ändern. Wenn Sie die Erweiterungen mehrerer Dateien auf einmal ändern möchten, verwenden Sie hierfür das Cmdlet „Rename-Item“ in Kombination mit dem Cmdlet „Get-ChildItem“.
Mit dem folgenden Skript werden alle Dateierweiterungen von „txt“ zu „bak“ geändert. Das Platzhalterzeichen (*) sorgt dafür, dass die Erweiterung aller Textdateien geändert wird:
Get-ChildItem \\fs\Shared\Logs\*.txt | Rename-Item -NewName { $_.name -Replace '\.txt$','.bak' }
Mit den Anleitungen in diesem Artikel können Sie verschiedene einfache Vorgänge im Zusammenhang mit der Verwaltung von Dateien auf Ihren Speichersystemen automatisieren und haben so mehr Zeit für wichtigere Aufgaben. Viel Glück!