So verwalten Sie Dateien mit Powershell

Letzte Aktualisierung: 04/10/2024
So verwalten Sie Dateien mit Powershell

Systemadministratoren müssen täglich zahlreiche Standardvorgänge an den vielen Dateien und Ordnern ihrer Windows -Server durchführen . Diese Aufgaben umfassen häufig die Verwaltung von Benutzerdaten auf gemeinsam genutzten Ressourcen und die Sicherstellung ordnungsgemäßer Datensicherungen. Um den damit verbundenen manuellen Aufwand zu reduzieren, können Sie PowerShell verwenden.

In diesem Artikel erfahren Sie, wie Sie PowerShell verwenden, um:

  • Objekte in einem Verzeichnis anzeigen
  • Erstellen Sie Dateien und Ordner
  • Dateien und Ordner löschen
  • Kopieren Sie Dateien und Ordner
  • Verschieben Sie Dateien oder Verzeichnisse
  • Dateien umbenennen
  • Dateierweiterungen ändern
  • Und vieles mehr

Bevor Sie beginnen, stellen Sie sicher, dass Ihre Systemrichtlinie die Ausführung von PowerShell-Skripts zulässt.

Objekte in einem Verzeichnis anzeigen

Um den Inhalt eines Verzeichnisses auf einem Windows-Dateiserver anzuzeigen, verwenden Sie das Cmdlet „Get-ChildItem“ . Um alle versteckten Dateien anzuzeigen, fügen Sie den Parameter „-Force“ hinzu. Der folgende Befehl zeigt alle Stammobjekte im Ordner „Shared“ an.

Hier erfahren Sie mehr über: Fehlerbehebung: Das Update ist nicht für Ihr Gerät geeignet

  • Get-ChildItem -Force \\ fs \ Shared

Wenn Sie auch alle Unterordner und deren Inhalte sehen möchten, fügen Sie den Parameter -Recurse hinzu:

  • Get-ChildItem -Force \\ fs \ Shared -Recurse

Um die Ergebnisse zu filtern, fügen Sie dem Cmdlet „Get-ChildItem“ die Parameter „Filter“, „Exclude“, „Include“ und „Path“ hinzu . Für eine erweiterte Objektfilterung verwenden Sie das Cmdlet „Where-Object“ . Das folgende Skript sucht im TI-Archiv nach allen ausführbaren Dateien, 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 Sie Dateien und Ordner mit PowerShell

Um mit Windows PowerShell neue Objekte zu erstellen, können Sie das Cmdlet New-Item verwenden und den Typ des zu erstellenden Elements angeben, z. B. ein Verzeichnis, eine Datei oder einen Registrierungsschlüssel.

Dieser Befehl erstellt beispielsweise einen Ordner:

  • New-Item -Path '\\fs\Shared\NewFolder' -ItemType Verzeichnis

Und dadurch entsteht eine leere Datei:

  • New-Item -Path '\\fs\Shared\NewFolder\newfile.txt' -ItemType Datei

Erstellen Sie Dateien und schreiben Sie Daten darauf

Es gibt mindestens zwei integrierte Methoden zum Erstellen einer Datei und zum Schreiben von Daten in diese. Die erste Methode ist die Verwendung des Cmdlets Out-File :

  • $text = 'Hallo Welt!' | Ausgabedatei $text-FilePath C:\data\text.txt

Um eine vorhandene Datei zu überschreiben, verwenden Sie den Schalter –Force-Parameter. Sie können Dateien auch mit dem Cmdlet Export-Csv erstellen, das das Ergebnis in eine CSV-Datei exportiert, die in Excel geöffnet werden kann:

  • Get-ADuse -Filter * | Export-Csv -Pfad C:\data\ADusars.csv

Erstellen Sie Dateien, nachdem Sie sichergestellt haben, dass sie noch nicht vorhanden sind

Das folgende Skript prüft, ob eine bestimmte Datei (pctxt) bereits in einem bestimmten Ordner vorhanden ist. Falls die Datei noch nicht existiert, erstellt das Skript eine Liste aller Active Directory-Computer und speichert diese in einer neuen Datei namens pctxt.

# erstellt eine Reihe von Textdateien

$files = Get-ChildItem C:\data\*. txt | Wählen Sie -vollständigen Namen erweitern

# Überprüfen Sie, ob die Datei in der Zeichenfolge vorhanden ist

$files -match „pc.txt“

# Wenn die Übereinstimmung „True“ zurückgibt, beenden Sie, wenn sie „False“ zurückgibt, erstellen Sie einen Bericht

if ($files -eq 'False') {

Get-ADComputer -Filter * | Export-Csv -Pfad C:\data\pc.txt

}

mehr {exit}

Löschen Sie Dateien und Ordner mit PowerShell

Um Elemente zu entfernen, verwenden Sie das Cmdlet Remove-Item. Beachten Sie, dass Sie zur Laufzeit zur Bestätigung aufgefordert werden, wenn das Objekt nicht leer ist. Das folgende Beispiel zeigt, wie Sie den IT-Ordner, alle seine Unterordner und die darin enthaltenen Dateien löschen:

Delete-Element-Path '\\fs\shared\it\'

Bestätigen

Das Element in \\pdc\shared\ hat untergeordnete Elemente und der Recurse-Parameter wurde nicht angegeben. Wenn Sie fortfahren, werden alle untergeordneten Elemente mit dem Element entfernt.

Sind Sie sicher, dass Sie fortfahren möchten?

[J] Ja [A] Ja für alle [N] Nein [L] Nein für alle [S] Unterbrechen [?] Hilfe

(Standard ist „Y“):

Können Sie den Schalter verwenden, wenn Sie bereits überprüft haben, dass alle Objekte in einem Ordner gelöscht werden sollen? Fallback zum Überspringen des Bestätigungsschritts:

  • Delete-Item -Path '\\ fs \shared \it \' -Recurse

Löschen Sie Dateien und Ordner, die älter als X Tage sind

Manchmal ist es notwendig, alte Dateien aus einem bestimmten Verzeichnis zu bereinigen. So erledigen Sie diese Aufgabe:

$Folder = „C:\Backups“

#Dateien entfernen, die älter als 30 Tage sind

Get-ChildItem $Folder -Recurse -Force -ea 0 |

? {! $_. PsIsContainer -und $_. LastWriteTime -lt (Get-Date).AddDays (-30)} |

ForEach-Object {

$_ | -Gewalt

$_. Vollständiger Name | Ausgabedatei C:\log\deletedbackups.txt -Append

  Taskeng.Exe | Was es ist, häufige Fehler und Lösungen

}

Löschen Sie Dateien, nachdem Sie überprüft haben, ob sie vorhanden sind

So überprüfen Sie, ob eine Datei vorhanden ist, und löschen sie, falls vorhanden:

$FileName = 'C:\data\log.txt'

If (Test-Path $FileName) {

   Element $FileName löschen

}

Löschen Sie Dateien auf mehreren Computern mit einem einzigen Skript

Um Dateien auf Remotecomputern zu löschen, müssen Sie über Sicherheitsberechtigungen für den Zugriff darauf verfügen. Stellen Sie sicher, dass Sie UNC-Pfade verwenden, damit das Skript den Speicherort der Dateien korrekt ermittelt.

$filelist = @(«\c$\Temp», «\c$\Backups») # Variable zum Löschen von Dateien und Ordnern

$computerlist = Get-Content C:\data\pc.txt # Liste der Remotecomputer abrufen

    foreach ($Computer in $Liste der Computer) {

        foreach ($file in $filelist) {

            $ filepath = Join-Path «\\ $computer \» «$ filelist» # Unc-Pfade zu Dateien und Ordnern generieren

            if (testpath $filepath)

            {

            Element löschen $filepath -force -recurse -ErrorAction Weiter}}}

Kopieren Sie Dateien und Ordner mit PowerShell

Mit dem Cmdlet „Copy-Item“ können Sie Objekte von einem Pfad in einen anderen kopieren. Der folgende Befehl erstellt eine Sicherungskopie, indem die Datei „usars.xlsx“ von einem Remotecomputer (fs) kopiert und über das Netzwerk auf einem anderen Computer (fs2) gespeichert wird:

  • Kopieren Sie das Element -Path\\ fs\Shared\it\usas.xlsx -Destination\\ fs2\Backups\it\usas.xlsx

Wenn die Zieldatei bereits vorhanden ist, schlägt der Kopierversuch fehl. Um die vorhandene Datei zu überschreiben, auch wenn sie schreibgeschützt ist, verwenden Sie den Parameter -Force.

  • Element kopieren -Pfad\\ fs\Shared\it\usas.xlsx -Destination\\ fs2\Backups\it\usas.xlsx -Force

Kopieren Sie Dateien mit PowerShell auf oder von einem Remote-Computer

Wenn Sie Dateien auf oder von Remotecomputern kopieren, achten Sie darauf, UNC-Pfade zu verwenden.

Verwenden Sie beispielsweise diesen Befehl, um Dateien von einem entfernten Dateiserver in das lokale Verzeichnis C: zu kopieren:

  • Element kopieren \\ fs \ c $ \ temp -Recurse C: \ data \

Um Dateien aus Ihrem lokalen Verzeichnis in den Remote-Ordner zu kopieren, kehren Sie einfach die Quell- und Zielspeicherorte um:

  • Kopieren Sie das Element C:\data\-Recurse\\fs\c$\temp

Kopieren Sie mithilfe eines Skripts mehrere Dateien über das Netzwerk von einem Server auf einen anderen

Sie können auch Dateien von einem Remote-Server auf einen anderen kopieren. Das folgende Skript kopiert rekursiv den Ordner \\fs\Shared\temp nach \\fs\Shared\test :

  • Kopieren Sie das Element \\fs\Shared\temp -Recurse\\fs\Shared\test

Kopieren Sie nur bestimmte Dateitypen

Um nur bestimmte Dateien von der Quelle zum Ziel zu kopieren, verwenden Sie den Parameter -Filter. Der folgende Befehl kopiert beispielsweise nur TXT-Dateien von einem Ordner in einen anderen:

  • Element kopieren -Filter *.txt -Path \\ fs \ Shared \ it -Recurse -Destination \\ fs2 \ Shared \ text

Kopieren Sie Dateien mit den Befehlen XCOPY und ROBOCOPY oder COM-Objekten

Sie können auch die Befehle XCOPY und ROBOCOPY ausführen, um Dateien zu kopieren oder COM-Objekte zu verwenden, wie im folgenden Beispiel:

  • (New-Object -ComObject Scripting.FileSystemObject).CopyFile('\\fs\Shared', 'fs2\Backup')

Verschieben Sie Dateien und Verzeichnisse mit PowerShell

Das Cmdlet „Move-Item“ verschiebt ein Element zusammen mit seinen Eigenschaften, Inhalten und untergeordneten Elementen von einem Ort an einen anderen. Es kann auch eine Datei oder ein Unterverzeichnis von einem Verzeichnis an einen anderen Ort verschieben.

Der folgende Befehl verschiebt eine bestimmte Sicherungsdatei von einem Speicherort an einen anderen:

  • Move-Item -Path \\ fs \ Shared \ Backups \ 1.bak -Destination \\ fs2 \ Backups \ archive \ 1.bak

Dieses Skript verschiebt den gesamten Backups-Ordner und seinen Inhalt an einen anderen Speicherort:

  • Move-Item -Path \\ fs \ Shared \ Backups -Destination \\ fs2 \ Backups \ archive

Das Backup-Verzeichnis und alle seine Dateien und Unterordner werden im Archivverzeichnis angezeigt.

Benennen Sie Dateien mit Powershell um

Mit dem Cmdlet „Rename-Item“ können Sie ein Objekt umbenennen, ohne dessen Inhalt zu verändern. Objekte können mit dem Befehl „Rename-Item“ nicht verschoben werden. Verwenden Sie dazu das Cmdlet „Move-Item“, wie bereits erläutert.

Der folgende Befehl benennt eine Datei um:

  • Element umbenennen -Path «\\fs\Shared\temp.txt» -NewName «new_temp.txt»

Benennen Sie mehrere Dateien um

Um mehrere Dateien gleichzeitig umzubenennen, verwenden Sie ein Skript wie dieses:

$files = Get-ChildItem -Path C:\Temp #Liste der Dateien erstellen

foreach ($file in $files)

{

    $newFileName = $file.Name.Replace("A", "B") #ersetze "A" durch "B"

    Benennen Sie das Element $file $newFileName um

}

Bearbeiten Sie Dateierweiterungen mit PowerShell

Sie können auch Rename-Item verwenden , um Dateierweiterungen zu ändern. Wenn Sie die Erweiterungen mehrerer Dateien gleichzeitig ändern möchten, verwenden Sie das Cmdlet Rename-Item zusammen mit dem Cmdlet Get-ChildItem.

Das folgende Skript ändert alle Dateierweiterungen von „txt“ in „bak“. Das Platzhalterzeichen (*) wird verwendet, um alle Textdateien einzuschließen:

  • Get-ChildItem \\ fs \ Geteilt \ Logs \ *. Txt | Element umbenennen - Neuer Name {$_. Name – Ersetzen Sie „\.txt$“, „.“ Bak'}
  Was ist „Write Once, Run Anywhere“ (WORA): Funktionsweise in Java, Vorteile, Herausforderungen und Ökosystem

Get-Content – ​​Wie lese ich den Inhalt einer Datei in PowerShell?

Das Cmdlet „Get-Content“ ist einer der unverzichtbaren Befehle bei der Analyse von PowerShell-Skripten. Damit können Sie den Inhalt einer Datei in PowerShell lesen, was eine sehr häufige Aktion ist. Zusätzlich zum Lesen der Daten können wir die Daten in eine Variable importieren, um sie im PowerShell-Skript zu verwenden. Mit Get-Content können Sie beispielsweise den Inhalt einer Protokolldatei abrufen.

Wir werden sehen, dass Get-Content ein leistungsstarkes Cmdlet ist , das mehr kann, als nur den gesamten Inhalt einer Datei abzurufen. Daher widmen wir ihm einen eigenen Artikel. Dieses Cmdlet funktioniert in Windows PowerShell 5.1 und PowerShell, einschließlich der aktuellsten Version: PowerShell 7.1.1.

II. Lesen Sie einfach den Inhalt einer Datei

Zunächst lesen wir den Inhalt einer Textdatei, die eine Liste von Werten enthält. Um diesem Teil des Tutorials zu folgen, erstellen Sie bitte eine Datei namens „ Paystxt “ und speichern Sie sie unter „ C:\TEMP “. Diese Datei sollte Folgendes enthalten:

  • Frankreich
  • Costa Rica
  • Belgien
  • Schweizer
  • Spanien
  • Kolumbien
  • Kanada
  • Brasilien
  • Island
  • Nicaragua

Schritte zum Lesen des Inhalts in Powershell

  1. Schritt 1: Um den Inhalt dieser Datei in der Konsole zu lesen und anzuzeigen, ist der Befehl sehr einfach, da Sie nur den Namen der Datei angeben müssen (oder den vollständigen Pfad, wenn er sich nicht im aktuellen Verzeichnis befindet):
  2. Schritt 2: Sie bekommen den Inhalt «C:\TEMP\Pays txt»
C:\TEMP\Pays txt
C:\TEMP\Pays txt
  1. Schritt 3:Der Parameter -Path wird implizit für diesen Wert verwendet. Wenn wir den folgenden Befehl schreiben, ist es dasselbe.
    1. Get-Content -Path «C:\TEMP\Pays txt»

Hinweis : Die Anzeige des Inhalts in der Konsole ist wenig hilfreich. Interessanter ist es, den Dateiinhalt in einer Variablen zu speichern, um ihn später auszuwerten. Erstellen Sie dazu einfach eine Variable, beispielsweise `$Country` , und weisen Sie ihr den Dateiinhalt als Wert zu.

  • $Country = Get-Content «C:\TEMP\Pays txt»

Aus Neugier können wir uns den Datentyp der Variable $Country ansehen , nachdem wir ihr einen Wert zugewiesen haben:

  • $Country.GetType()
So verwalten Sie Dateien mit Powershell
$Country.GetType()

Wir sehen, dass wir zwei relevante Informationen erhalten: „ Object[] “ und „ System.Array “. Wir haben es mit einem Objekt in Form eines Arrays von Werten zu tun; das ist interessant!

Um die Anzahl der Elemente in dieser Textdatei zu zählen, können wir dies auf zwei verschiedene Arten tun:

  • $Pays.Count
  • ($Country | Messobjekt).Anzahl

Da es sich um eine Matrix handelt, haben wir 10 Elemente; der erste Wert entspricht Index 0 und der letzte Index 9 (da wir nur 10 Elemente haben). Daher ist der Wert an Index 0 „Frankreich“ und der Wert an Index 9 „Nicaragua“.

Wenn Sie den am Index 0 gefundenen Wert, also den ersten Wert, abfragen möchten, ist das ganz einfach:

  • $ Land [0]

Oder wenn Sie es vorziehen, läuft es darauf hinaus:

  • (Inhalt „C:\TEMP\Pays txt“ abrufen) [0]

Ebenso gibt es einen Trick, um den letzten Wert abzurufen, ohne die genaue Indexnummer zu kennen! Als Zahl für den Index verwenden Sie einfach „-1“:

  • (Inhalt „C:\TEMP\Pays txt“ abrufen) [-1]
„C:\TEMP\Pays txt“) [-1]
«C:\TEMP\Pays txt») [-1]

Anstatt den Dateiinhalt als Array abzurufen, können wir ihn als einzelne Zeichenkette abrufen. Fügen Sie dazu einfach den Parameter -Raw zum Befehl hinzu:

  • Get-Content -path «C:\TEMP\Pays txt» -raw
Get-Content -path "C:\TEMP\Pays txt" -raw
Get-Content -path «C:\TEMP\Pays txt» -raw

Fahren wir mit einigen praktischen Beispielen fort.

III. Der Schwanz von Linux im PowerShell-Stil

Unter Linux ist es üblich, mit dem Befehl `tail` die letzten Zeilen einer Datei anzuzeigen . Ich verwende ihn häufig, um Logdateien abzufragen, insbesondere weil die Ausgabe dynamisch ist: Werden Zeilen zur Datei hinzugefügt, werden diese fortlaufend in der Konsole angezeigt.

Das ist sehr praktisch, und das Gleiche lässt sich auch in PowerShell mit Get-Content und der Option -Tail und der zweiten Option -Wait !? erreichen.

Ohne die Option -Wait können wir die letzten X Zeilen einer Datei mit -Tail allein abrufen. Um beispielsweise die letzten 5 Zeilen unserer Datei Pays.txt abzurufen:

  • Get-Content „C:\TEMP\Pays txt“ -Tail 5

Wenn wir nun die letzten 5 Zeilen anzeigen und darauf warten möchten, zukünftige der Datei hinzugefügte Zeilen abzurufen, verwenden wir diese Syntax:

  • Get-Content „C:\TEMP\Pays txt“ -Tail 5 -wait
  GlobalFoundries bekräftigt sein Engagement für ARC-, MIPS- und RISC-V-IP.

Um dies zu testen, führen Sie den oben genannten Befehl aus und ändern Sie anschließend die Datei " Pays txt ", um eine Zeile hinzuzufügen: Sie werden sehen, wie diese fast in Echtzeit in der PowerShell-Konsole angezeigt wird, in der der Befehl ausgeführt wird.

Mit dem Befehl `-Wait` hält `Get-Content` die Datei geöffnet und prüft jede Sekunde auf neue Inhalte. Um den Befehl zu beenden, drücken Sie einfach „ Strg + C “.

Sie sollten sich darüber im Klaren sein, dass Sie nur die Option -Wait verwenden können : In diesem Fall wird die gesamte Datei in der Konsole angezeigt und bleibt dann ausstehend.

  • Get-Content „C:\TEMP\Pays txt“ -Warten

IV. Holen Sie sich die ersten X Zeilen einer Datei

Genauso können wir die ersten Zeilen einer Datei abrufen. In diesem Fall verwenden wir nicht `-Tail`, sondern ` -TotalCount` . Auch hier müssen Sie die Anzahl der anzuzeigenden Zeilen angeben.

  • Get-Content „C:\TEMP\Pays txt“ -TotalCount 5

Andererseits ist die Option -Wait logischerweise nicht mit der Option -TotalCount sinnvoll.

Get-Content „C:\TEMP\Pays txt“ -TotalCount 5
Get-Content „C:\TEMP\Pays txt“ -TotalCount 5

V. NTFS: Siehe a Sequenz Geheimnis in einer Datei

Das NTFS - Dateisystem ist insofern einzigartig, als es verschiedene Datenströme („ Streams “) zur Datenspeicherung verwendet. Beim Schreiben von Daten in eine Datei werden diese im Datenstrom $DATA gespeichert . Beim Zugriff auf die Datei lesen wir daher den Inhalt dieses Datenstroms.

Des Weiteren können wir dank des Befehls Get-Item sehen, dass unsere Datei „ Pays txt “ diesen Ablauf aufweist:

  • Element „C:\TEMP\Pays txt“ abrufen -Stream*

Außerdem fällt uns auf, dass die Konsole nur diesen Datenstrom zurückgibt.

C:\TEMP\Pays txt" -Stream *
C:\TEMP\Pays txt»-Stream*

Das Tolle daran ist, dass Sie Ihre eigene Übertragung erstellen können , um die Daten darin zu verbergen!

Sie müssen lediglich Daten in unsere Datei „ Pays.txt “ einfügen und die Reihenfolge festlegen , in der die Daten gesendet werden sollen. Erstellen wir beispielsweise den Datenfluss „ Creds “ mit dem Wert „ Password “.

  • Add-Content -Path «C:\TEMP\Pays txt» -Stream Creds -Value «Password»

Wenn wir nun die Liste der Übertragungen in unserer Datei erneut anzeigen, erhalten wir einen neuen Eintrag:

Add-Content -Path "C:\TEMP\Pays txt" -Stream Creds -Value "Password"
Add-Content -Path «C:\TEMP\Pays txt» -Stream Creds -Value «Password»

Wenn wir Spaß daran haben, den Inhalt unserer Datei anzuzeigen, werden wir feststellen, dass der Wert „Passwort“, den ich gerade zur Datei hinzugefügt habe, nicht angezeigt wird.

  • Inhalt „C:\TEMP\Pays txt“ abrufen

Um den Standardstream abzufragen, können Sie dessen Namen nach dem Parameter -Stream von Get-Content angeben (beachten Sie die Syntax):

  • Get-Content «C:\TEMP\Pays txt» -Stream ':$DATA'

Wenn Sie den Inhalt des zuvor erstellten „Creds“ -Streams anzeigen möchten, geben Sie einfach Folgendes ein:

  • Inhalt „C:\TEMP\Pays txt“ abrufen – Creds streamen

Der Befehl gibt einen einzelnen Wert zurück: Passwort

Der Beweis im Bild unten:

Add-Content -Path "C:\TEMP\Pays txt" -Stream Creds -Value "Password"

Das ist gut zu wissen, aber wir sollten es nicht als Wunderlösung zum Verbergen von Passwörtern oder vertraulichen Daten betrachten. Tatsächlich können Sie Ihr System mit speziellen Tools oder dem Befehl „ Get-ChildItem“ nach Dateien durchsuchen, die neben dem Standarddatenstrom „$DATA“ einen zusätzlichen Datenstrom besitzen.

Es ist etwas abseits des Themas, aber um diese Analyse von einem laufenden Ordner aus als Ausgangspunkt durchzuführen:

  • Get-ChildItem -Recurse | ForEach{Get-Item$_. FullName -Stream *} | Wo -ne' übertragen wird: $Data'

Dieser Befehl ruft unsere Pays.txt-Datei ab und sendet die Anmeldeinformationen („Creds?“). Es ist sehr wahrscheinlich, dass Office-Dokumente in der Ausgabe des Befehls ebenfalls mit einer Sequenz namens „ Zone.Identifier “ hervorgehoben werden. Diese enthält eine ID, die dem System die Zone angibt, zu der die Datei gehört ( Intranet, Internet usw., im Gegensatz zu IE-Zonen).

Vielleicht interessiert Sie auch folgender Artikel: Wie man eine hohe CPU-Auslastung durch Searchindexer.exe behebt.

Fazit

Wie Sie sehen, können Sie Ihre Dateien mit PowerShell so verwalten. Mithilfe der Anweisungen in diesem Artikel können Sie verschiedene einfache Dateiverwaltungsvorgänge auf Ihren Dateispeichersystemen automatisieren und so Zeit sparen, die Sie für wichtigere Aufgaben nutzen können. Wir hoffen, diese Informationen waren hilfreich.