Home
» Wiki
»
PowerShell und alles, was Sie über dieses Dienstprogramm wissen müssen
PowerShell und alles, was Sie über dieses Dienstprogramm wissen müssen
Was wäre, wenn Ihr PC alltägliche Aufgaben für Sie erledigen könnte? Mit Windows PowerShell ist das möglich. So automatisieren Sie mit PowerShell wiederkehrende, alltägliche Aufgaben, die niemand ständig wiederholen möchte.
Microsoft PowerShell ist ein leistungsstarkes Befehlszeilenprogramm und eine Skriptsprache für Administratoren zur Automatisierung zahlreicher Aufgaben für Computer und Netzwerke. PowerShell enthält Komponenten der Eingabeaufforderung und basiert auf dem .NET Framework. Wenn Sie über WebTech360 lesen, sollten Sie wissen, dass PowerShell das Tool der Wahl für IT-Administratoren zur Verwaltung großer Netzwerke ist.
Das Erlernen der Verwendung von PowerShell vereinfacht viele mühsame Alltagsaufgaben. Sie können außerdem systemweite Änderungen über das Netzwerk vornehmen, ohne jeden Server einzeln konfigurieren zu müssen. PowerShell wird zu einem wesentlichen Bestandteil der Ausführung hybrider Cloud -Umgebungen.
PowerShell bietet vielfältige Einsatzmöglichkeiten, um effizienter zu arbeiten und den reibungslosen Betrieb Ihres Netzwerks zu gewährleisten. Zu den grundlegendsten Anwendungen gehören: die Planung täglicher Systemupdates, die Erstellung von Berichten über laufende Prozesse, regelmäßige Wartungen und vieles mehr. Viele dieser Aufgaben lassen sich zwar über die grafische Benutzeroberfläche erledigen, doch PowerShell ermöglicht es, sie schneller auszuführen.
Wenn Sie eine routinemäßige Wartungsaufgabe haben, deren Einrichtung nur wenige Minuten dauert, können Sie dieselbe Funktionalität in einem einzigen Befehl namens PowerShell skripten. Beim nächsten Öffnen des Skripts wird es dann im Hintergrund ausgeführt. Wenn Sie die PowerShell-Skriptlogik beherrschen, verstehen, wie Objekte und Variablen funktionieren, und diese intelligent in Ihrem Netzwerk einsetzen, werden Sie sich fragen, warum Sie PowerShell nicht schon früher verwendet haben.
Dieses Tutorial behandelt die Grundlagen von PowerShell und ist besonders für IT-Einsteiger hilfreich, insbesondere wenn sie mit der Windows-Eingabeaufforderung vertraut sind. Es behandelt die Verwendung grundlegender Tools und Befehle, die Arbeit mit Dateien und Ordnern, das Verständnis von Objekten, die Verwendung von Variablen und die Verwaltung von Remote-Servern.
Eine kurze Geschichte der Windows-Befehlszeilenprogramme
Nach der Veröffentlichung von Windows NT wurde CMD.EXE zum Kommandozeilenprogramm für Windows. Obwohl CMD.EXE einige Elemente seines DOS-Vorgängers (COMMAN.COM) übernahm, basierte es immer noch auf einer eher primitiven Skriptsprache: der Verwendung von Windows-Befehlsdateien (.CMD und .BAT). Die Einführung von Windows Scripting Host sowie der Sprachen VBScript und JScript erweiterte die Skriptfunktionen des Dienstprogramms erheblich.
Diese Technologien stellen eine ausgewogene Mischung aus erweiterten Kommandozeilenprogrammen und Skriptumgebungen dar. Das eigentliche Problem ist nicht, wie viele CMD.EXE-, .CMD- und Windows Scripting Host-Dateien damit bearbeitet werden können. Die Hauptbeschwerde und Sorge betrifft die Erledigung scheinbar einfacher Aufgaben.
Mithilfe eines Frameworks aus Befehlszeilen- und Skripttools erfordert jedes einigermaßen umfassende Skript eine Kombination aus Batchbefehlen, Windows Scripting Host und eigenständigen ausführbaren Dateien. Jedes Skript verwendet unterschiedliche Konventionen für Ausführung und Anfragen, Analyse und Datenrückgabe.
Mangelhafte Variablenunterstützung in CMD.EXE, inkonsistente Schnittstellen und eingeschränkter Zugriff auf Windows-Einstellungen sowie eine weitere Schwachstelle erschweren die Implementierung und Nutzung von Kommandozeilenskripten. Was ist diese „andere Schwachstelle“, fragen Sie sich vielleicht? Es ist Text. In diesen Technologien ist alles Text. Die Ausgabe eines Befehls oder Skripts ist Text und muss analysiert und neu formatiert werden, um als Eingabe für den nächsten Befehl zu dienen. Dies ist der grundlegende Ausgangspunkt, den PowerShell von allen herkömmlichen Shells übernimmt.
Einführung in PowerShell-Tools, -Befehle und -Module
Die drei in diesem Abschnitt vorgestellten Konzepte bilden nur die Grundlagen zum Verständnis der Schlüsselkonzepte, die die Grundlage von PowerShell bilden. Sie werden mehr Zeit in das Erlernen und Beherrschen der fortgeschritteneren Konzepte investieren müssen, wenn Sie sich mit PowerShell-Befehlen befassen.
PowerShell-Tools
PowerShell ist standardmäßig in Windows 10, Windows 7, Windows Server 2008 R2 und neueren Windows-Versionen installiert. Neuere Versionen von PowerShell bieten neue Funktionen und „Cmdlets“ (Microsofts Bezeichnung für PowerShell-Befehle – ausgesprochen „Command-lets“) und werden mit der entsprechenden Version des Windows Management Framework (WMF) installiert.
Derzeit ist WMF 5.1 die neueste empfohlene Version. In einigen Fällen sind einige neue Funktionen zusätzlich zur WMF-Version auch vom Betriebssystem abhängig. Beispielsweise unterstützen Windows 8 und Windows Server 2012 das Cmdlet „Test-NetConnection“, mit dem Sie die Konnektivität zu einem bestimmten TCP/IP- Port testen können. Dieses Cmdlet ist unter Windows 7 jedoch selbst mit der neuesten WMF-Version nicht verfügbar.
Auf den meisten Windows-Systemen stehen Benutzern zwei PowerShell-Umgebungen zur Verfügung: die PowerShell-Konsole und die PowerShell ISE (Integrated Scripting Environment). Die PowerShell-Konsole ähnelt einer herkömmlichen Befehlszeile, bietet jedoch die volle Funktionalität von PowerShell. Variablennamen, Schleifen, Befehlsvervollständigung und Piping sind alle über die PowerShell-Konsole verfügbar.
Für erweiterte Anwendungen (z. B. Skripting) bietet PowerShell ISE Befehls-Autovervollständigung, Code-Hervorhebung und die Intellisense-Codevervollständigung von Microsoft, um Sie beim Erstellen und Testen von PowerShell-Code zu unterstützen. PowerShell ISE ermöglicht Ihnen außerdem die gleichzeitige Arbeit mit mehreren PowerShell-Skripts mithilfe der Registerkartennavigation.
Cmdlets in PowerShell
Die Grundlage der PowerShell-Befehle ist das Cmdlet. Microsoft verfolgte beim Erstellen von Cmdlets in PowerShell verschiedene Designstrategien.
Erstens ist es möglich, Cmdlet-Namen einfach abzuleiten oder zumindest leichter auffindbar zu machen. PowerShell-Befehle oder Cmdlets sind zudem benutzerfreundlicher gestaltet und verfügen über eine standardisierte Syntax, die das Erstellen von Skripts über die Befehlszeilenschnittstelle vereinfacht.
Cmdlets verwenden das Verb-Nomen-Format, wie in Get-Service, Stop-Service oder Import-Csv. Der Verbteil des Cmdlet-Namens gibt die mit dem Nomen ausgeführte Aktion an. Normalerweise enthalten Cmdlets zum Abrufen von Informationen das Verb Get im Namen, z. B. Get-Process oder Get-Content . Befehle zum Ändern von Objekten beginnen üblicherweise mit dem Verb Set , und Befehle zum Hinzufügen einer neuen Entität beginnen üblicherweise mit Add oder New .
Zweitens erhalten auch in PowerShell häufig verwendete Parameter standardisierte Namen. Beispielsweise ermöglicht der Parameter „-ComputerName“ die Ausführung des Cmdlets auf einem oder mehreren Remotecomputern. „-Credential“ dient zur Bereitstellung eines Authentifizierungsobjekts mit Benutzeranmeldeinformationen, um den Befehl als bestimmter Benutzer auszuführen.
Module in PowerShell
Sie können Aliase sowohl für Cmdlets als auch für Parameter verwenden, um Tastenanschläge zu sparen und die Gesamtlänge des Befehls zu verkürzen (nützlich beim Verketten mehrerer Befehle). Diese Aliase folgen zwar nicht immer den Standardnamenskonventionen, spiegeln aber dennoch traditionelle Befehlszeilenprogramme wider.
In PowerShell entsprechen Aliase wie DIR, CD, DEL und CLS den Cmdlets Get-ChildItem, Set-Location, Remove-Item und Clear-Host. Parameteraliase können auf zwei Arten funktionieren: Sie können einen vom Cmdlet bereitgestellten vordefinierten Alias verwenden oder durch Eingabe von genügend Zeichen eine eindeutige Übereinstimmung zwischen den unterstützten Parametern des Cmdlets erstellen.
Datei- und Ordnerverwaltung
Die meisten Systemadministratoren müssen im Laufe ihrer Arbeit Dateien und Ordner bearbeiten, sei es das Verschieben eines Ordners an einen anderen Speicherort auf dem Server, das Archivieren von Protokolldateien oder die Suche nach großen Dateien. Bei wiederholten Vorgängen für viele Dateien ist die Automatisierung mit PowerShell eine effektive und zeitsparende Lösung.
Um Dateien und Ordner zu finden, war der Befehl „dir“ eines der ersten Kommandozeilentools, die ein Administrator in der Computer-Ära erlernte. „dir“ listet die Dateien und Ordner im angegebenen Verzeichnis auf.
PowerShell verfügt über einen ähnlichen Befehl in Form des Cmdlets Get-ChildItem . Mit Get-ChildItem können Sie schnell eine Liste von Dateien in einem Verzeichnis erstellen, sodass Sie die Dateien über einen Pipe-Befehl bearbeiten oder die Ausgabe einer Variablen zuweisen können.
Get-ChildItem kann einfach durch Angabe eines Pfads verwendet werden, entweder über eine Pipeline, mit dem Parameter -Path oder direkt nach dem Cmdlet-Namen. Um die von Get-ChildItem zurückgegebene Antwort zu ändern, müssen einige vom Cmdlet bereitgestellte Parameter berücksichtigt werden.
Der Parameter -Filter ist eine Möglichkeit, nach Dateien zu suchen. Standardmäßig gibt Get-ChildItem nur direkte untergeordnete Elemente des Zielverzeichnisses zurück. Diese Funktionalität kann durch den Parameter -Recurse erweitert werden , der rekursiv nach Verzeichnissen im aktuellen Verzeichnis sucht.
In PowerShell 4.0 wurde mit Get-ChildItem die Möglichkeit hinzugefügt, Ergebnisse mithilfe der Schalter –File oder –Directory auf Dateien oder Verzeichnisse zu beschränken . Frühere Versionen von PowerShell mussten die Ergebnisse an Where-Object übergeben und dabei die Eigenschaft PSIsContainer filtern, um diese Bestimmung vorzunehmen. Ein Beispiel für beide Techniken zur Rückgabe von Verzeichnissen in C:\Users ist hier dargestellt:
Um versteckte oder Systemdateien zu erkennen, muss -Force verwendet werden. Get-ChildItem in PowerShell 4.0 und höher kann auch verwendet werden, um nur versteckte, schreibgeschützte oder Systemdateien mit -Hidden, -ReadOnly bzw. –System zurückzugeben . Ähnliche Funktionalität konnte in früheren Versionen durch Filtern der Mode-Eigenschaft mit Where-Object erreicht werden:
Normalerweise müssen wir beim Arbeiten mit Dateien nur wissen, ob die Datei existiert oder ob der Verzeichnispfad gültig ist. PowerShell bietet hierfür mit Test-Path ein Cmdlet, das den Wert „true“ oder „false“ zurückgibt.
Test-Path wird als Vorsichtsmaßnahme verwendet, bevor versucht wird, eine bestimmte Datei zu kopieren oder zu löschen.
Dateien kopieren, verschieben und löschen
Copy-Item: Kopiert eine oder mehrere Dateien oder Verzeichnisse von einem durch den Parameter -Path angegebenen Speicherort an den durch die Option -Destination angegebenen Speicherort.
Move-Item: Verschiebt eine Datei oder einen Ordner.
Beim Kopieren oder Verschieben einer Verzeichnisstruktur sollte -Recurse verwendet werden, damit das Cmdlet die Aktion auf das Verzeichnis und seinen Inhalt ausführt. In manchen Fällen ist auch -Force erforderlich, z. B. wenn eine schreibgeschützte Datei durch einen Kopiervorgang überschrieben wird.
Remove-Item: Datei, Ordner löschen.
Der Schalter -Force sollte verwendet werden, wenn eine schreibgeschützte Datei gefunden wird, und -Recurse sollte verwendet werden, wenn ein Verzeichnis und sein Inhalt gelöscht werden.
Verwenden von PowerShell -WhatIf und -Confirm
Bevor Sie eine umfangreiche Löschung durchführen, verwenden Sie -WhatIf . Mit -WhatIf können Sie sehen, was beim Ausführen eines Skripts oder Befehls passieren würde und ob dies möglicherweise negative Auswirkungen durch das Löschen wichtiger Geschäftsdaten hätte. Beachten Sie außerdem, dass -WhatIf nicht auf Dateioperationen beschränkt ist, sondern häufig in PowerShell verwendet wird.
Für Skripte, die Sie manuell ausführen möchten oder die abhängige Befehle enthalten, die manuell ausgeführt werden, sollten Sie -Confirm verwenden . So können Sie eine Benutzerinteraktion anfordern, bevor der Vorgang tatsächlich ausgeführt wird.
PowerShell-Skripte = Batchdateien auf Steroiden
PowerShell selbst ist in der .NET-Sprache geschrieben und basiert stark auf dem .NET Framework. Daher ist PowerShell als objektorientierte Shell- und Skriptsprache konzipiert. Alles in PowerShell wird als Objekt mit allen Funktionen des .NET Frameworks behandelt. Ein Befehl stellt eine Sammlung von Objekten bereit, die mit den Eigenschaften und Methoden dieses Objekttyps verwendet werden können. Wenn Sie die Ausgabe eines Befehls an einen anderen weiterleiten möchten, leitet PowerShell das Objekt weiter, nicht nur die Textausgabe des ersten Befehls. Dadurch erhält der nächste Befehl vollen Zugriff auf alle Eigenschaften und Methoden des Objekts in der Pipeline.
Die Behandlung aller Elemente als Objekte und die Möglichkeit, Objekte zwischen Befehlen zu akzeptieren, stellt einen großen Wandel in der Theorie der Befehlszeilenprogramme dar. Dennoch funktioniert PowerShell noch immer wie eine herkömmliche Shell. Befehle, Skripts und ausführbare Dateien können in die Befehlszeile eingegeben und ausgeführt werden, und die Ergebnisse werden als Text angezeigt. Windows-CMD- und -BAT-Dateien, VBScripts, JScripts und die in CMD.EXE ausgeführten ausführbaren Dateien können alle weiterhin in PowerShell ausgeführt werden. Da sie jedoch nicht objektorientiert sind, haben sie keinen vollständigen Zugriff auf die in PowerShell erstellten und verwendeten Objekte. Diese veralteten Skripts und ausführbaren Dateien behandeln zwar noch immer alles als Text, Sie können PowerShell jedoch mit zahlreichen anderen Technologien kombinieren. Dies ist insbesondere dann wichtig, wenn Sie PowerShell mit einer Sammlung vorhandener Skripts verwenden möchten, die Sie nicht alle auf einmal konvertieren können.
Erläuterung der PowerShell-Parameter
Cmdlets können Parameter akzeptieren, um ihr Verhalten zu ändern. Beim Ausführen eines Cmdlets oder einer Funktion können Sie Parameterwerte angeben, um festzulegen, was, wann, wo und wie jeder PowerShell-Befehl ausgeführt wird.
Beispielsweise ruft Get-Process alle laufenden Prozesse in Ihrem Betriebssystem ab und listet sie auf:
Get-Process listet alle laufenden Prozesse auf.
Was aber, wenn Sie nur einen bestimmten Prozess abrufen möchten? Dies ist mithilfe von Parametern möglich. Um beispielsweise alle Slack-Prozesse abzurufen, können Sie den Parameter Name mit dem Cmdlet Get-Process verwenden:
Get-Process -Name Slack
Dann werden Ihnen nur noch Prozesse mit dem Namen „Slack“ angezeigt:
Verwenden von Get-Process mit Parametern
Tipp : Einige Parameter sind „positional“, d. h. ihre Namen sind optional. In diesem Fall führen Get-Process -Name Slack und Get-Process Slack beide dieselbe Aufgabe aus.
Jedes Cmdlet akzeptiert unterschiedliche Parametertypen. Verwenden Sie den Befehl „Get-Help“, um die akzeptierten Parameter des Cmdlets im Abschnitt „SYNTAX“ anzuzeigen.
Get-Help Get-Process
Sie sehen eine Liste aller Möglichkeiten, wie Sie das angegebene Cmdlet ausführen können:
Cmdlet-Syntaxparameter
In diesem Fall akzeptiert das Cmdlet Get-Process Parameter wie Name, ID, Computername, Module, FileVersionInfo und andere gängige Parameter. Die Symbole bedeuten hier:
Symbol
Name
Bedeutung
Trommel
Parameter akzeptiert keine Eingabe
-
Bindestrich
Geben Sie den Parameternamen an
<>
geschweifte Klammern
Platzhalter für Text
[]
Klammern
Der Parameter kann einen oder mehrere Werte annehmen.
{}
geschweifte Klammern
Der Parameter akzeptiert eine Reihe von Werten.
Parameter akzeptieren eine Reihe von Werten, die den benötigten Datentyp angeben, z. B. Zeichenfolge, Ganzzahl, Boolescher Wert oder Datum/Uhrzeit. Beispielsweise der folgende Befehl:
Get-Process [[-Name] ]
... bedeutet, dass der Parameter Name einen oder mehrere Zeichenfolgenwerte akzeptiert, während dieser Befehl:
Get-Process -Id
... bedeutet, dass der ID -Parameter einen oder mehrere ganzzahlige Werte akzeptiert.
Im vorherigen Get-Process-Beispiel wurde der Parameter Name verwendet, um die Ergebnisse einzugrenzen. Wenn Sie die Ergebnisse jedoch auf einen spezifischeren Prozess eingrenzen möchten, können Sie den Parameter ID verwenden , der gemäß seiner Syntax eine Ganzzahl erfordert.
Get-Process -Id 3016
Dann sehen Sie nur einen Prozess in der Liste:
Verwenden des ID-Parameters im Cmdlet
Erstellen einer Pipeline
PowerShell verarbeitet alle Daten als Objekte. Um ein Skript zu erstellen, werden diese Objekte durch eine Reihe von Cmdlets oder Funktionen ausgeführt, die durch das Pipe-Symbol (|) verbunden sind. Die Auswahl der richtigen Cmdlets und deren logische Verknüpfung mithilfe einer Pipeline ist für ein effizientes Skript wichtig.
Angenommen, Sie erstellen ein Skript, um die fünf Dateien mit dem meisten Speicherplatz in einem Verzeichnis zu sortieren und anzuzeigen. Es gibt leistungsfähigere Möglichkeiten, ein Skript zum Sortieren von Dateien zu schreiben, aber dieses einfache ist leicht verständlich:
Skript Sort-LargeFiles PS1
Verwenden Sie dazu in PowerShell eine Pipeline, die wie folgt aussieht:
Da wir jetzt über eine funktionierende Pipeline verfügen, können Sie sie als PS1-Skriptdatei speichern, sodass Sie sie nicht bei jeder Verwendung importieren müssen.
Die einfachste Möglichkeit zum Erstellen einer PS1-Datei besteht darin, Ihr Skript in Notepad einzufügen und die Datei mit der Erweiterung .ps1 zu speichern.
Skript mit Notepad erstellen
Nachdem Sie die PS1-Datei erstellt haben, können Sie sie in PowerShell verwenden, indem Sie ./ScriptName.ps1 ausführen :
PS1-Skript verwenden
Tipp : Wenn ein Berechtigungsfehler auftritt, besteht die schnellste Lösung darin, PowerShell beim Ausführen Ihres Skripts mit Administratorrechten auszuführen.
Herzlichen Glückwunsch! Sie können jetzt PowerShell PS1-Skripts erstellen.
Beispiel für ein PowerShell-Skript
Über die Vorzüge neuer Technologien zu lesen und sie zu verstehen, ist eine Sache, sie aber tatsächlich zu nutzen, eine ganz andere! Im weiteren Verlauf dieses Artikels entwickeln wir ein PowerShell-Skript, um die Funktionen und die Anwendung zu demonstrieren.
DIR ist einer der am häufigsten verwendeten Befehle in CMD.EXE . Dieser Befehl zeigt alle Dateien und Unterverzeichnisse eines übergeordneten Verzeichnisses an (siehe Abbildung 1). Neben dem Namen jedes Objekts werden auch Datum und Uhrzeit der letzten Aktualisierung sowie die Größe jeder Datei angezeigt. DIR zeigt außerdem die Gesamtgröße aller Dateien im Verzeichnis sowie die Gesamtzahl der Dateien und Unterverzeichnisse an.
Abbildung 1
Die Ausführung von DIR in PowerShell erzeugt ebenfalls eine Verzeichnisliste wie in Abbildung 2, allerdings auf etwas andere Weise. PowerShell verfügt nicht über den DIR-Befehl, sondern über Get-ChildItem, das dieselbe Funktion erfüllt. In PowerShell ist DIR ein Alias für Get-ChildItem. Ich werde in diesem Artikel nicht näher auf Aliase eingehen. Stellen Sie sich DIR in PowerShell als Abkürzung für Get-ChildItem vor.
DIR in PowerShell bietet weitgehend die gleichen Informationen wie oben erwähnt: eine Liste der Dateien und Ordner, Datum und Uhrzeit der letzten Änderung sowie die Größe jeder Datei. Es fehlen jedoch die zusammenfassenden Informationen, die DIR in CMD.EXE bereitstellt: die Gesamtgröße aller Dateien im Ordner, die Gesamtzahl der Dateien und die Gesamtzahl der Unterordner.
Abbildung 2
Für das Beispielszenario müssen Sie ein PowerShell-Skript erstellen, das den Befehl CMD.EXE DIR simuliert. Im Folgenden erkläre ich die wichtigsten Teile eines Skripts.
DIR.PS1: Kopfzeile
Ein PowerShell-Skript besteht aus PowerShell-Befehlen in einer Textdatei mit der Erweiterung .PS1. Anstelle von DIR verwenden Sie eine Textdatei mit dem Namen DIR.PS1.
Um das Skript auszuführen, geben Sie den folgenden Befehl in den PowerShell-Bildschirm ein:
.DIR.PS1 X:Folder
Dabei ist X der Partitionsbuchstabe des Laufwerks (z. B. C, D, E) und Ordner der Ordnername.
Wenn Sie Informationen zur Partition eines Laufwerks benötigen, benötigen Sie Windows Management Instrumentation (WMI). Die Details von WMI gehen über den Rahmen dieses Artikels hinaus und werden daher hier nicht näher erläutert. Der folgende PowerShell-Code ist jedoch auch ohne WMI leicht verständlich. Sie können die Variable „$filter“ für den Befehl „Get-WmiObject“ erstellen. Dieser Filter teilt dem Befehl „Get-WmiObject“ mit, dass Sie nur Informationen zu einem bestimmten Laufwerk benötigen. Die Ergebnisse des Befehls „Get-WmiObject“ werden in der Variable „$volInfo“ gespeichert. Denken Sie daran, dass in PowerShell alles ein Objekt ist; „$volInfo“ ist nun ein von „Get-WmiObject“ zurückgegebenes Objekt.
Sie haben nun Zugriff auf alle mit dem Objekt verknüpften Objekte und Methoden. Die Volume-Seriennummer ist über die Eigenschaft VolumeSerialNumber zugänglich. Die zurückgegebene Nummer ist eine 8-stellige Zeichenfolge. Oftmals empfiehlt es sich jedoch, sie als vier durch einen Bindestrich getrennte Zahlen zu formatieren. Dies kann ähnlich wie in der folgenden Zeile erfolgen. Der Bindestrich am Ende der ersten Zeile ist das Zeilenfortsetzungszeichen in PowerShell. Er teilt PowerShell im Wesentlichen mit, dass die Zeile nicht umbrochen wird und die nächste Zeile eingeschlossen wird. Zeilenumbrüche sind beim Schreiben von Code nicht erforderlich, sollten aber verwendet werden, um die Breite zu reduzieren und den Code lesbarer zu machen.
Nachdem Sie nun ein $volInfo-Objekt erstellt haben, können Sie die DIR-Header-Informationen auf den Bildschirm schreiben. Wenn das Laufwerk keinen Namen hat, unterscheidet sich der auf dem Bildschirm angezeigte Text geringfügig von dem, wenn das Laufwerk einen Namen hat. Mit einer einfachen If-Else-Anweisung wird geprüft, ob die VolumeName-Eigenschaft eine leere Zeichenfolge ist. Mit der Write-Host-Anweisung wird jede Textzeile auf den Bildschirm geschrieben.
If ($volInfo.VolumeName -eq "") { Write-Host (" Volume in drive " + $drive + " has no label") } Else { Write-Host (" Volume in drive " + $drive + " is " + $volInfo.VolumeName) } Write-Host (" Volume Serial Number is " + $serial) Write-Host ("`n Directory of " + $args[0] + "`n")
Das Zeichen „ `n “ am Anfang und Ende des Write-Host-Befehls dient zum Einfügen einer neuen Zeile vor und nach dem Text. Der Write-Host-Befehl fügt am Ende jeder Zeile eine neue Zeile ein. „ `n “ erzeugt also eine Leerzeile vor und nach dem Text.
Ist Ihnen das „-eq“ im If-Befehl aufgefallen? Es handelt sich um einen Gleichheitsvergleichsoperator. Die folgende Tabelle zeigt alle Vergleichsoperatoren:
-eq, -ieq
Vergleichen nach
-ne, -ine
Vergleich ist nicht gleich
-gt, -igt
Vergleichen Sie größer als
-ge, -ige
Vergleichen Sie größer als oder gleich
-lt, -ilt
Vergleichen Sie kleiner als
-le, -ile
Vergleichen Sie kleiner als oder gleich
Das Zeichen -i vor Vergleichsoperatoren gibt an, dass der Operator nicht zwischen Groß- und Kleinschreibung unterscheidet.
Abbildung 3: Ausgabedaten des aktuellen Skripts
DIR.PS1: Liste der Dateien/Ordner
Jetzt können Sie den Inhalt und die Eigenschaften dieses Ordners anzeigen. Rufen Sie zunächst den PowerShell-Befehl „Get-ChildItem“ auf, um eine Sammlung von Dateien abzurufen und diese als Parameter an das Skript zu übergeben. Der Befehl „Get-ChildItem“ ruft eine Sammlung von Datei- und Ordnerobjekten ab, nicht nur deren Namen, sondern leitet diese Objekte auch direkt an den Befehl „Sort-Object“ weiter, um sie zu sortieren. Standardmäßig sortiert der Befehl „Sort-Object“ Objekte basierend auf der Eigenschaft „Name“. Sie müssen daher keine weiteren Parameter angeben. Die sortierte Objektsammlung wird dann in einer Variable namens „$items“ gespeichert.
$items = Get-ChildItem $args[0] | Sort-Object
Sobald Sie eine Sammlung von Datei- und Ordnerobjekten erstellt haben, müssen Sie diese durchlaufen und die entsprechenden Eigenschaften anzeigen. Der Befehl hierfür lautet ForEach. Für jede Datei oder jeden Ordner werden als Eigenschaften das Datum und die Uhrzeit der letzten Änderung, der Name, die Länge oder die Größe der Datei angezeigt. Die seltsam aussehenden Zeichenfolgen in den Klammern sind .NET-Zeichenfolgenformatcodes. Sie dienen zur Links-/Rechtsausrichtung von Feldern sowie zur Formatierung von Datum, Uhrzeit und Zahlen. Das Verständnis dieser Zeichenfolgeformatcodes ist nicht besonders wichtig, da sie für die Natur dieses Skripts nicht wesentlich sind.
Mit der If-Anweisung bestimmen Sie, ob ein Objekt ein Verzeichnis ist oder nicht. Wenn das erste Zeichen des Mode-Attributs „d“ ist, handelt es sich bei dem Objekt um ein Verzeichnis. Sie müssen dies doppelt prüfen, da der Code für Verzeichnisse oft vom Code für Dateien abweicht.
Beachten Sie die Zeile $totalDirs++ innerhalb der If-Anweisung. Dieser Zähler dient zur Erfassung der Anzahl der Verzeichnisse. Ebenso gibt es die Variable $totalFiles, die die Gesamtgröße aller Dateien erfasst. Diese Werte werden immer während der Ausführung berechnet. Sie werden jedoch erst angezeigt, wenn die Dateiauflistung abgeschlossen ist.
Abbildung 4: Zeigt die Ausgabedaten des aktualisierten Skripts.
DIR.PS1: Fußzeile
Jetzt müssen Sie nur noch die Gesamtzahl der Dateien, Verzeichnisse, die Gesamtgröße aller Dateien und den freien Speicherplatz dieser Laufwerkspartition auf dem Bildschirm anzeigen. Dazu benötigen Sie die im vorherigen Abschnitt erstellten Zählervariablen ($totalFiles, $totalDirs, $totalSize). Den freien Speicherplatz können Sie der Variable $volInfo entnehmen, die Sie zu Beginn des Skripts erstellt haben.
Abbildung 5: Zeigt die vollständigen Ausgabedaten des Skripts.
Prognosen und Verbesserungen können
Obwohl das von Ihnen erstellte Skript eine nahezu identische Ausgabe wie der Befehl CMD.EXE DIR erzeugt, gibt es einige Einschränkungen, die Sie beachten sollten, und einige Verbesserungen, die vorgenommen werden können.
Dieses Skript führt keine Fehlerprüfung durch.
Wenn dem Skript kein gültiger Pfad übergeben wird, schlägt das Skript mit einer PowerShell-Fehlermeldung fehl.
Die Gesamtzahl der im Skript angegebenen Verzeichnisse ist 2 kleiner als das Ergebnis des CMD.EXE DIR-Befehls, da der Get-ChildItem-Befehl die beiden Verzeichnisse „.“ und „..“ wie in CMD.EXE nicht zählt.
Ihr Skript sortiert nur nach Dateinamen und Ordnernamen und bietet keine weitere Sortierung nach Attributen.
Ihr Skript kann den Inhalt des Ordners und aller Unterordner nicht anzeigen.
Wie PowerShell Ihnen hilft, alles auf Ihrem PC zu automatisieren
Schreiben Sie einfache PowerShell-Skripte
Mit PowerShell können Sie fast alles automatisieren, z. B. das Batch-Umbenennen von Dateien zur Konsistenzverbesserung oder das automatische Starten von Anwendungen. Wir schreiben ein paar einfache Windows PowerShell-Skripts, um zu sehen, wie es funktioniert.
Hinweis : Wenn beim Ausführen des Skripts ein Fehler bezüglich der Ausführungsrichtlinie auftritt, müssen Sie die Ausführung des Skripts möglicherweise vorübergehend zulassen, indem Sie „Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass“ ausführen.
Stapelweises Umbenennen von Dateien in einem Ordner
Mit PowerShell können Sie Dateien auf Ihrem PC kopieren, verschieben und löschen. Sie können auch mehrere Dateien eines bestimmten Dateityps gleichzeitig umbenennen. So können Sie beispielsweise mehrere Textdateien umbenennen, indem Sie in ihren Dateinamen das Präfix „oldco“ durch „newco“ ersetzen:
Im obigen Skript ist „.txt“ der Dateierweiterungsfilter. Sie können ihn ändern und auf .jpg, .docx usw. einstellen, um nach verschiedenen Dateitypen zu suchen.
Anwendung automatisch starten
Wenn Sie jeden Tag dieselben Anwendungen öffnen, können Sie ein PowerShell-Skript schreiben, um sie mit einem einzigen Klick zu starten:
#Open multiple apps with a single click
Start-Process "notepad.exe"
Start-Process "calc.exe"
Start-Process "Chrome.exe"
Start-Process "slack.exe"
Fügen Sie das Skript in eine Editor-Datei ein und speichern Sie es unter dem Namen LaunchFavoriteApps.ps1. Doppelklicken Sie anschließend auf die Datei, um alle im Skript aufgeführten Apps zu starten.
Kopieren Sie wichtige Dateien an einen Sicherungsspeicherort
Mit dem folgenden Skript können Sie wichtige Dateien regelmäßig an einem Sicherungsort sichern. Ändern Sie bei Bedarf die Quell- und Zielpfade:
#Copy MyFiles folder contents to MyFilesBackup in D:\
Copy-Item -Path "C:\Documents\MyFiles" -Destination "D:\MyFilesBackup" -Recurse
Schreiben Sie ein PowerShell-Skript, um Dateien täglich automatisch zu organisieren
Da täglich viele verschiedene Dateitypen heruntergeladen werden, kann der Download-Ordner schnell überfüllt sein. Um dies zu beheben, können wir ein PowerShell-Skript schreiben, das heruntergeladene Dateien am Ende jedes Tages nach Dateityp in Ordner sortiert.
Öffnen Sie eine neue Notepad-Datei und fügen Sie das folgende Skript ein. Achten Sie darauf, den Quellordnerpfad im Skript so zu ändern, dass er mit dem Download-Ordnerpfad übereinstimmt:
# Change the source folder path below
$sourcePath = "E:\Downloads"
# Add file mapping folder names; the Others folder includes all the files that do not match file types in the other categories
$fileTypes = @{
"Documents" = @("*.docx", "*.pdf", "*.txt")
"Images" = @("*.jpg", "*.png", "*.gif")
"Media" = @("*.mp4", "*.mp3", "*.mov")
"Zip" = @("*.zip", "*.rar")
"ISO" = @("*.iso")
"Others" = @("*")
}
# Iterate through each folder type and prepare a destination folder for organizing files
foreach ($folder in $fileTypes.Keys) {
# Create the destination folder path
$destPath = Join-Path -Path $sourcePath -ChildPath $folder
# Check if the destination folder exists, and create it if it doesn't
if (!(Test-Path -Path $destPath)) {
New-Item -ItemType Directory -Path $destPath | Out-Null
}
# Move matching files from the source folder to the destination folder based on file type patterns
foreach ($pattern in $fileTypes[$folder]) {
Get-ChildItem -Path $sourcePath -Filter $pattern -File -ErrorAction SilentlyContinue | ForEach-Object {
try {
Move-Item -Path $_.FullName -Destination $destPath -Force -ErrorAction Stop
Write-Output "Moved: $($_.FullName) to $destPath"
} catch {
Write-Warning "Failed to move file: $($_.FullName). Error: $_"
}
}
}
}
Write-Output "Files organized successfully!"
Um die Datei zu speichern, klicken Sie auf Datei > Speichern unter und geben Sie als Dateinamen „OrganizeDownloadsFolder.ps1 “ ein. Klicken Sie anschließend auf Dateityp und wählen Sie „ Alle Dateien“ . Doppelklicken Sie auf die Datei „OrganizeDownloadsFolder.ps1“ , um das Skript auszuführen.
Planen und Ausführen von Aufgaben
Das Schreiben eines Skripts ist natürlich ein Teil des Automatisierungsprozesses. Der zweite Teil besteht darin, sicherzustellen, dass das Skript automatisch ausgeführt werden kann, um die Aufgabe auszuführen. Dazu können wir geplante Aufgaben erstellen, um das Skript täglich oder nach Bedarf auszuführen.
Öffnen Sie PowerShell, kopieren Sie das folgende Skript, fügen Sie es ein und drücken Sie die Eingabetaste . Ersetzen Sie „J:\OrganizeDownloadsFolder.ps1“ durch den vollständigen Dateipfad zu Ihrem Skript „OrganizeDownloadsFolder.ps1“.
Sobald Sie fertig sind, drücken Sie die Eingabetaste . Das Skript erstellt eine geplante Aufgabe im Taskplaner, um das Dateiorganisationsskript täglich um 17:00 Uhr auszuführen. Wenn Sie eine andere Uhrzeit wünschen, können Sie diese im obigen Skript ändern.
Darüber hinaus können Sie PowerShell verwenden, um andere alltägliche Aufgaben zu automatisieren, z. B. ein Speicherplatzüberwachungsskript, das Sie benachrichtigt, wenn auf Ihrem primären Laufwerk nicht mehr genügend Speicherplatz vorhanden ist, das Kennwortschützen von PDF-Dokumentstapeln und sogar das Anwenden von Live-Hintergrundbildern aus Ihrem Bilderordner.
Obwohl PowerShell eine leistungsstarke Dienstprogramm- und Skriptsprache ist, erfordert es etwas Zeit, sie zu verstehen und zu verwenden, insbesondere wenn Sie mit der .NET Framework-Umgebung nicht vertraut sind. Ich hoffe, dieser Artikel und das Beispielskript sind für alle nützlich, die PowerShell verstehen möchten. Das im Artikel erstellte Beispielskript ist jedoch recht einfach. Ich bin überzeugt, dass es umfassender erstellt und weiterentwickelt werden kann, um komplexere Anwendungen zu unterstützen.