2017-02-14 5 views
1

Ich habe ein Verzeichnis mit 10 git Repos. Ich möchte git pull auf allen von ihnen zu tun, parallel in einem einzigen Befehl:Powershell - Alias ​​für einen laufenden mehrere Hintergrundbefehle

gpa // git-pull-all 

Dies sollte eigentlich wie folgt vor:

cd c:\repos; 
foreach $dir in `ls -d` do 
    git pull & // unix version for background 
    cd .. 
end 

Dies sollte ganz einfach sein, in bash (Unix). In Powershell finde ich es sehr kompliziert. Wie kann ich es richtig machen?

+0

'PS C: \> Hilfe about_Jobs' –

Antwort

1

Dies wäre kein Alias ​​(im PowerShell-Sprachgebrauch), es wäre nur eine Funktion oder ein Skript.

Meistens würden Sie nur die relevanten Analoga in PowerShell finden.

So ls in Powershell ist eigentlich ein Alias ​​für Get-ChildItem, die in Powershell auch v3 + einen -Directory Parameter unterstützt nur Verzeichnisse zurück, so dass ein Teil sofort fast funktioniert.

Obwohl Sie eine foreach($thing in $things) Schleife tun, in diesem Fall wäre es ein bisschen natürlicher sein (Powershell-ey) zum Rohr in ForEach-Object, so etwas wie diese:

$repos = 'C:\repos' 
Get-ChildItem -Path $repos -Directory | ForEach-Object -Process { 
    Push-Location -Path $_ 
    git pull 
    Pop-Location 
} 

Als Referenz mit Alias-Namen und alternative Syntax, um es den meisten wie die original aussehen könnte es wie folgt geschehen:

cd c:\repos 
foreach ($dir in (ls -di)) { 
    git pull 
    cd .. 
} 

jedoch habe ich die erste empfehlen, weil:

  • bewahrt Ihre ursprünglichen Pfad
  • es verwendet keine Aliase
  • verwendet es, was ich fühle mich ein einfacher Weg von Iterieren ist (in Powershell)

Keines dieser Beispiele behandeln die Backgrounding von die Aufgabe jedoch. Ich habe das vorläufig weggelassen, weil es nicht so analog ist.

Um dies zu tun, können Sie PowerShell Jobs verwenden. Entweder mit Start-Job oder mit Invoke-Command -AsJob.

Schauen Sie sich an, wie Sie Jobs verwenden und entscheiden, ob Sie die Zeit für nur 10 Repos verwenden möchten.

Verwandte Themen