Tags: PowerShell, Kommandozeile
Statt auf Dauer am veralteten Konzept von cmd.exe und Batch-Dateien herumzudoktern, hat Microsoft mit der PowerShell einen Nachfolger für den alten Kommandointerpreter und seine Scripting-Technik entwickelt. Während aber praktisch alle Admins die Mittel der alten Kommandozeile in ihrer täglichen Arbeit nutzen, ist das Wissen über die PowerShell noch nicht so verbreitet. Um den Umstieg zu vereinfachen, wäre es günstig, wenn man die alten Befehle in der neuen Umgebung weiterverwenden könnte.
Die PowerShell ist gleichzeitig eine Scripting-Umgebung und eine Kommandozeile, die man interaktiv für die Eingabe von Befehlen verwenden kann. Damit unterscheidet sie sich von VBScript, dessen Befehle man nicht auf der Kommandozeile eingeben kann und die zur Ausführung den Scripting Host benötigen. Aufgrund ihrer doppelten Rolle könnte man also PowerShell als Standard für die Eingabeaufforderung wählen und damit cmd.exe ersetzen.
Powershell ist objektorientiert, cmd.exe textorientiert
Aufgrund der Unterschiede zwischen PowerShell und cmd.exe sorgt Microsoft allerdings für keinen besonders sanften Umstieg von der alten auf die neue Shell. Im Gegensatz zum alten Kommandointerpreter liefern Cmdlets nicht bloß Text zurück, sondern .NET-Objekte, deren Eigenschaften man in einem nachfolgenden Kommando gezielt ansprechen kann.
Gleichzeitig geben die Objekte über ihre Methoden und Eigenschaften vor, wie sie zu nutzen sind, so dass sich die alten Befehle von cmd.exe auf dieser Basis nicht einfach nachbauen lassen.
Zusätzlich setzt die PowerShell im Gegensatz zum alten Kommandointerpreter durchgängig eine konsistente Konvention für Befehlsnamen um, die durch die Übernahme der cmd-Befehle durchbrochen würde. Allerdings bietet die PowerShell eine Alias-Funktion, mit der sich Cmdlets oder Parameternamen unter einer anderen Bezeichnung ansprechen lassen.
Genau diesen Weg hat Microsoft gewählt, um die internen cmd-Befehle in Powershell bereitzustellen. Aufgrund der verschiedenen Syntax der Powershell-Pendants lassen sich die alten Kommandos aber nur sehr eingeschränkt weiternutzen.
Aliase bilden inkompatible Befehle unvollständig ab
Wenn man Get-Alias ausführt, dann findet man dort viele cmd-Befehle als vordefinierte Aliase wieder. Sie verweisen auf neue Cmdlets, beispielsweise dir auf Get-ChildItem oder cd auf Set-Location.
Jedoch unterscheiden sich die zulässigen Schalter und Optionen der alten und neuen Befehle schon syntaktisch, so dass man einem Alias nur das übergeben kann, was der PowerShell-Befehl kennt.
Eine Nutzung eines Alias nach dem Muster eines gleichnamigen cmd-Befehls scheitert, sobald man zusätzlich zu Zeichenketten für Dateinamen oder Pfadangaben einen Schalter hinzufügt. Deswegen lassen sich die kurzen und praktischen Befehle wie dir /ad oder del *.tmp /s nicht ausführen, sie verursachen eine Fehlermeldung.
Aliase durch eigene Funktionen ersetzen
Eine Möglichkeit, die Kompatibilität von Powershell mit dem alten Kommandointerpreter zu verbessern, bestünde darin, die vordefinierten Aliase zu löschen und sie durch eigene Funktionen zu ersetzen, die zur Ausführung der Befehle eine temporäre Kopie von cmd.exe aufrufen:
remove-item alias:dir
function dir {cmd /c dir $args}
Diese Lösung funktioniert aus naheliegenden Gründen nicht mit Befehlen, die nur die Umgebung des aktuellen Kommandointerpreters verändern, beispielsweise das Arbeitsverzeichnis wechseln, eine Umgebungsvariable setzen oder den Prompt neu festlegen.
Außerdem muss bedacht werden, dass die Umstellung von einem vordefinierten Alias auf eine selbstdefinierte Funktion nur während der aktuellen Sitzung wirksam ist. Will man sie dauerhaft etablieren, muss man die entsprechenden Befehle in das PowerShell-Profil aufnehmen.
Powershell-Befehle aus cmd.exe aufrufen
Wer sich primär im alten Kommandointerpreter zuhause fühlt und von dort die Möglichkeiten der mächtigeren PowerShell in Anspruch nehmen möchte, kann den umgekehrten Weg wählen und von cmd.exe aus eine temporäre Kopie von PowerShell aufrufen, um ausgewählte Cmdlets oder Scripts auszuführen. Dazu gibt man
powershell -command "Befehl"
ein. Zu beachten ist hier, dass weitere Optionen für den Aufruf der PowerShell (etwa -NoProfile) vor dem Parameter -command stehen müssen, weil sie sonst als Argumente an den Befehl weitergereicht werden. Bei Bedarf kann man getrennt durch Semikolon auch mehrere Befehle auf einmal übergeben.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
- Windows Terminal 1.6 Preview erhält GUI für Einstellungen, v1.5 nun offizielles Release
- PowerShell 7.1 (als Store-App) verfügbar, Updates für PSReadLine, SecretManagement und PowerShellGet
- Fehler beim Ändern der Zeitzone in Windows Server 2019: Kommandozeile als Alternative
- Systemzeit remote auf der Kommandozeile oder mit PowerShell abfragen
- Benutzereingaben in PowerShell: Read-Host, mandatory = $true, Out-GridView
Weitere Links