Dateiverwaltung mit PowerShell

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:

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!

Tutorial zur Skripterstellung  mit Windows PowerShell für Einsteiger