Wie kann ich einen PowerShell-Alias ​​mit Argumenten in der Mitte schreiben?

74

Ich versuche, einen Windows PowerShell-Alias ​​einzurichten, um die ausführbare g ++ - Datei von MinGW mit bestimmten Parametern auszuführen. Diese Parameter müssen jedoch nach dem Dateinamen und anderen Argumenten stehen. Ich möchte nicht die Mühe machen, eine Funktion einzurichten, und das alles. Gibt es eine Möglichkeit, einfach etwas zu sagen wie:

alias mybuild="g++ {args} -lib1 -lib2 ..."

oder so ähnlich? Ich bin mit PowerShell nicht allzu vertraut und habe Schwierigkeiten, eine Lösung zu finden. Jemand?

Ken Bellows
quelle

Antworten:

118

Sie möchten eine Funktion verwenden, keinen Alias, wie Roman erwähnt hat. Etwas wie das:

function mybuild { g++ $args -lib1 -lib2 ... }

Um dies auszuprobieren, hier ein einfaches Beispiel:

PS> function docmd { cmd /c $args there }
PS> docmd echo hello
hello there
PS> 

Möglicherweise möchten Sie dies auch in Ihr Profil aufnehmen, damit es verfügbar ist, wenn Sie PowerShell ausführen. Der Name Ihrer Profildatei ist in enthalten $profile.

Kennzeichen
quelle
5
Eine kleine Verbesserung, um einen besseren Zugriff auf Befehle zu erhalten, ist die Verwendung von New-Alias, um einen Alias ​​der neuen Funktion zuzuordnen. Function SCP-Filetransfer { cmd /c pscp.exe -i ~\.ssh\id_rsa.ppk $args } New-Alias -Force pscp SCP-Filetransfer
Tobias Hochgürtel
3
Der Nachteil davon ist, dass keine Parametervervollständigung für die Funktion verfügbar ist
Jack Ukleja
5

Es ist so etwas nicht eingebaut. IMHO ist eine Wrapper-Funktion der beste Weg, um so weit zu gehen. Aber ich weiß, dass einige Problemumgehungen erfunden wurden, zum Beispiel:

https://web.archive.org/web/20120213013609/http://huddledmasses.org/powershell-power-user-tips-bash-style-alias-command

Roman Kuzmin
quelle
8
Ein Bash-Alias ​​ist eigentlich eher ein Synonym für eine PowerShell-Funktion oder ein Cmdlet. Ein Alias ​​in PowerShell wird eigentlich nur zum Kürzen einer vorhandenen Funktion / eines Cmdlets verwendet - beispielsweise der Alias rmfür Remove-Item.
Goyuix
Das Problem mit Funktionen ist ihr gottloser Overhead in Powershell.
bkr
4

Um eine Funktion zu erstellen, speichern Sie sie als Alias ​​und behalten Sie das Ganze für später in Ihrem Profil bei. Verwenden Sie:

$g=[guid]::NewGuid();
echo "function G$g { COMMANDS }; New-Alias -Force ALIAS G$g">>$profile

wo Sie durch ALIASden gewünschten Alias ​​und COMMANDSdurch den auszuführenden Befehl oder die auszuführende Befehlsfolge ersetzt haben.

Stattdessen können (und sollten!) Sie stattdessen einen Alias ​​für das oben Gesagte erstellen, indem Sie:

echo 'function myAlias {
    $g=[guid]::NewGuid();
    $alias = $args[0]; $commands = $args[1]
    echo "function G$g { $commands }; New-Alias -Force $alias G$g">>$profile
}; New-Alias alias myAlias'>>$profile

Nur für den Fall, dass Ihr Gehirn von der gesamten Rekursion (Aliasing von Aliasen usw.) nach dem Einfügen des zweiten Codeblocks in Ihre PowerShell (und dem Neustart von PowerShell) auf den Kopf gestellt wurde, ist ein einfaches Beispiel für die Verwendung:

alias myEcho 'echo $args[0]'

oder ohne Argumente:

alias myLs 'ls D:\MyFolder'

Wenn Sie noch kein Profil haben

Die obige Methode schlägt fehl, wenn Sie noch kein Profil haben! Verwenden Sie in diesem Fall New-Item -type file -path $profile -force diese Antwort .

NH.
quelle
1
Die Verwendung dieses (und aller anderen Alias ​​über Funktionsansätze ) schlägt fehl, wenn Eingaben in den Alias-Befehl weitergeleitet werden. Testfall: ps | grepWo grepist ein Alias, der gut funktioniert? Wo grepeine Funktion ist, hängt das Obige auf unbestimmte Zeit. Gibt es eine Problemumgehung dafür?
Ehiller
@ehiller, ich kann Ihr Problem nicht duplizieren, aber meine Funktionen wurden für die Verwendung mit Argumenten und nicht mit Pipelines entwickelt.
NH.
>>Erstellt eine Datei bei Bedarf, sodass zum Glück keine zusätzliche Logik erforderlich ist, um den Fall zu behandeln, in dem die $PROFILEnoch nicht vorhanden ist.
mklement0
Ich mag die Grundidee Ihres Ansatzes, aber die Implementierung ist unnötig komplex: Es ist überhaupt nicht erforderlich, einen PowerShell-Alias ​​über einen Aux zu erstellen. Funktion - Definieren Sie einfach eine Funktion direkt mit dem gewünschten "Alias" -Namen.
mklement0
@ mklement0 war es nicht das, worum es in der Beschwerde von ehiller oben ging?
NH.
2

Dies ist eine Beispielfunktion, die je nach Aufruf verschiedene Funktionen ausführt:

Function Do-Something {
[CmdletBinding()] 
[Alias('DOIT')]
Param(
    [string] $option1,
    [string] $option2,
    [int] $option3)
#$MyInvocation|select *|FL
If ($MyInvocation.InvocationName -eq 'DOIT'){write-host "You told me to do it...so i did!" -ForegroundColor Yellow}
Else {Write-Host "you were boring and said do something..." -ForegroundColor Green}
}
Josh
quelle