Wie man die PowerShell mit Aliase personalisiert
Die PowerShell ist nicht nur Microsofts Alternative zur cmd.exe und zum Windows Script Host, sie ist besonders inspiriert von Unix-Shells wie der Bash, von Perl, PHP, Python und C#. Mit ihr macht es jetzt auch unter Windows Spaß, zu skripten, was in der cmd.exe mit Batch-Programmen nur sehr rudimentär möglich war. Mit dem Windows Script Host kann man zwar mittels VBScript und CScript Programme für die Konsole schreiben, er ersetzt aber einfach kein richtiges Terminal mit Skriptsprache und Befehlen zum Ausführen.
An den Umstieg muss ich mich trotzdem erstmal gewöhnen. Damit die Lernkurve nicht ganz so steil wird, habe ich damit angefangen, die PowerShell mit Aliase zu personalisieren. Wenn man schon mal etwas mehr mit einer modernen Shell wie der Bash zu tun hatte, weiß man die Möglichkeit zu schätzen, häufig benutzte Befehle mit einem Alias abzukürzen. Die PowerShell bringt von Haus aus schon Aliase mit, z.B. cd
für Set-Location
oder dir
für Get-ChildItem
. Um einen Alias in der PowerShell zu erstellen, benutzt man den Befehl Set-Alias
:
PS C:\> Set-Alias np notepad PS C:\> np |
Der Befehl Set-Alias np notepad
setzt das Alias np
um den Editor Notepad aufzurufen. Nur wer benutzt schon gerne Notepad als Editor, wenn es so gute Alternativen wie Notepad++ gibt. Zum Einrichten dieses Aliases sollte man allerdings eine Umgebungsvariable für den Programmpfad verwenden. Eventuell benötigt man auch eine Funktion, um ein Alias für ein Programm oder ein CmdLet zu erstellen, da man sich ansonsten mit Fehlermeldungen herum ärgern darf:
PS C:\> function fnp++{ >> Set-Location $env:ProgramFiles\notepad++ >> .\notepad++.exe >> } >> PS C:\> Set-Alias np++ fnp++ PS C:\> np++ |
Dummerweise ist das Alias wieder Verschwunden, wenn man die PowerShell schließt. Um länger etwas vom benutzerdefinierten Alias zu haben, muss man es im Benutzerprofil speichern. Um zu schauen, ob ein Profil schon vorhanden ist, benötigt man folgenden Befehl:
PS C:\> Test-Path $profile False |
Erhält man so wie hier ein False zurück, muss man das Profil mit New-Item
erstellen:
PS C:\> New-Item -path $profile -type file -force Verzeichnis: C:\Dokumente und Einstellungen\Christian\Eigene Dateien\WindowsPowerShell Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 26.05.2011 21:31 0 Microsoft.PowerShell_profile.ps1 |
Jetzt kann man das Profil mit einem Editor bearbeiten, in dem man es mit notepad $profile
öffnet, und trägt folgende Zeilen ein:
function fnp++{ Set-Location $env:ProgramFiles\notepad++ .\notepad++.exe } Set-Alias np++ fnp++ |
Das Alias ist nun dauerhaft gespeichert und steht auch nach einem Neustart der PowerShell zur Verfügung. Allerdings kann es passieren, dass nach den Änderungen beim Start der PowerShell folgende Meldung erscheint:
‚Die Datei „[…] WindowsPowerShell\Microsoft.PowerShell_profile.ps1“ kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen erhalten Sie mit „get-help about_signing“.‘
Um eigene PowerShell-Skripte auf dem System grundsätzlich ausführbar zu machen, gibt man in die PowerShell selbst folgenden Befehl ein:
Set-ExecutionPolicy RemoteSigned |
Man kann auch Unrestricted oder AllSigned anstatt RemoteSigned als Argument übergeben. Das erste Argument Unrestricted ist aber zu unsicher, da es die Ausführung jedes Skripts erlaubt, und das zweite Argument AllSigned ist für eigene Scripte zu umständlich, da es nur die Ausführung von signierten Skripten erlaubt. RemoteSigned ist da ein guter Mittelweg, da aus dem Netz heruntergeladene Skripte nur ausgeführt werden, wenn sie signiert sind.
Anstelle des Befehls Set-ExecutionPolicy
kann man auch den Eintrag in der Registry direkt ändern. Entweder geht man dabei über das gute alte Regedit und ruft zu Fuß folgenden Schlüssel auf,
HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
um anschließend Name und Wert einzutragen:
Das kann man aber auch schon selbst in der PowerShell erledigen:
New-ItemProperty -path "hklm:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" -name "ExecutionPolicy" -value "RemoteSigned" |
Nun sollte man nicht nur das Skript für das Profil, sondern auch andere eigene Skripte ausführen können. Wer wissen will, wie es um die Richtlinien zur Ausführung von Skripten auf dem Rechner überhaupt bestellt ist, sollte sich Get-ExecutionPolicy -List
näher anschauen.
Geschrieben in Powershell, Windows