Schnellstartbefehl „Komplex“ in PowerShell

Oct 20 2020

Ist es möglich, "komplexe" PowerShell-Befehle in PowerShell mithilfe eines Alias ​​auszuführen?

Um Ihnen ein Beispiel zu geben, möchte ich den Befehl Get-VpnConnection -name "VPNname"über einen (nicht reservierten) Ein-Wort-Befehl ersetzen, z. B. vpnüber einen Alias? Funktioniert leider set-Alias vpn "Get-VpnConnection -name VPNname"nicht und auch nicht set-Alias vpn Get-VpnConnection -name "VPNname"(beachten Sie die unterschiedliche Position des ersten Anführungszeichens).

Bisher besteht meine "Problemumgehung" darin, den Befehl als Skriptdatei im "Startverzeichnis" von PowerShells (in meinem Fall C:\Users\username) zu speichern und .\vpn.ps1über einen Alias auszuführen . Ich erstelle den Alias ​​mit set-Alias vpn ".\script_vpncheck.ps1". Gibt es eine direkte Möglichkeit, dies zu tun (ohne eine Skriptdatei zu erstellen)?

Folgefrage: Falls dies nicht möglich ist, möchte ich die Aliase mithilfe einer Skriptdatei initialisieren, z. B. über .\script.ps1(Hinweis: Ich muss sie nicht dauerhaft speichern). Das funktioniert leider nicht. Die Datei scheint ausgeführt zu werden, aber die Aliase funktionieren nicht. Irgendeine Idee warum?

Antworten

3 phuclv Oct 20 2020 at 13:25

Speichern Sie einfach den Alias ​​im Profil

  • Öffnen Sie das Profil in PowerShell, indem Sie es ausführen notepad $PROFILE(oder verwenden Sie einen Ihrer Lieblingseditoren).
  • Geben Sie die Befehle ein, die Sie in diese Datei ausführen möchten, und speichern Sie sie (zum Beispiel Set-Alias).
  • Starten Sie PowerShell neu oder erstellen Sie das neu aktualisierte Profil, indem Sie es ausführen . $PROFILE

Das Profil ist genau wie .bashrcin Bash, das beim Starten der Shell ausgeführt wird. Neben Aliasen können Sie auch Funktionen für komplexere Dinge schreiben . Sie sind nach dem Start von PowerShell verfügbar

function vpn($url) { Get-VpnConnection -name $url }
Set-Alias -Name vpn -Value Get-VpnConnection

Sie können keinen Alias ​​für Befehle mit Argumenten festlegen, daher müssen Sie in diesem Fall eine Funktion erstellen

Der Grund, warum Ihre ps1-Datei nicht funktioniert, ist, dass sie in der Subshell ausgeführt wird. Wenn die Subshell geschlossen wird, wird alles gelöscht, einschließlich der neuen Aliase. Sie müssen Quelle das Skript mit dem Punktquellenoperator .(ähnlich .in bash) es in dem aktuell Shell laufen

. .\script.ps1

Aber anstatt das jedes Mal zu beschaffen, wenn Sie den Alias ​​wollen, tun Sie es einfach permanent im Profil wie oben

1 KeithMiller Oct 20 2020 at 17:41

Aliase sollen keine Parameter annehmen. Aus dem about_aliasesHilfethema:

ALTERNATIVE NAMEN FÜR BEFEHLE MIT PARAMETERN

Sie können einem Cmdlet, Skript, einer Funktion oder einer ausführbaren Datei einen Alias ​​zuweisen. Sie können einem Befehl und seinen Parametern keinen Alias ​​zuweisen. Sie können beispielsweise dem Cmdlet Get-Eventlog einen Alias ​​zuweisen, dem Befehl Get-Eventlog -LogName System jedoch keinen Alias ​​zuweisen.

Sie können eine Funktion erstellen, die den Befehl enthält. Geben Sie zum Erstellen einer Funktion das Wort "Funktion" gefolgt von einem Namen für die Funktion ein. Geben Sie den Befehl ein und setzen Sie ihn in geschweifte Klammern ({}).

Mit dem folgenden Befehl wird beispielsweise die Syslog-Funktion erstellt. Diese Funktion repräsentiert den Befehl Get-Eventlog -LogName System:

function Get-SystemEventlog {Get-Eventlog -LogName System}
Set-Alias -Name syslog -Value Get-SystemEventlog

Sie können jetzt "syslog" anstelle des Befehls eingeben. Außerdem können Sie Aliase für die neue Funktion erstellen.

Sie benötigen jedoch keine separate Skriptdatei. Sie können eine einfache Funktion definieren und mit dem folgenden Code zu Ihrem Profil hinzufügen:

'Function vpn { Get-VpnConnection -name VPNname }' | Add-Content $PROFILE

Der Befehl vpnist ab diesem Zeitpunkt in allen PowerShell- Sitzungen verfügbar .