2017-02-14 75 views
1

我有一个包含10 git回购的目录。 我愿做git pull上所有的人,在并行,在一个单一的命令:Powershell - 运行多个后台命令的别名

gpa // git-pull-all 

这实际上应该做到以下几点:

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

这应该是bash很简单(UNIX )。在PowerShell中,我发现它非常复杂。 我该如何正确地做到这一点?

+0

'PS C:\> help about_Jobs' –

回答

1

这不会是一个别名(用PowerShell的说法),它只是一个函数或脚本。

大多数情况下,您只需在PowerShell中找到相关的类似物。

所以ls在PowerShell中实际上是Get-ChildItem的别名,它在PowerShell v3 +中也支持-Directory参数,只返回目录,因此该部分几乎可以马上工作。

虽然你可以做一个foreach($thing in $things)循环,在这种情况下,这将是一个多一点自然(PowerShell的EY)管道进入ForEach-Object,所以是这样的:

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

仅供参考,使用别名和替代语法使它看起来最像你原来,这是可以做到这样的:

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

不过我推荐的第一个原因是:

  • 它保留原来的路径
  • 不别名
  • 使用它使用什么,我觉得是迭代的一个更简单的方法(在PowerShell中)

这些都不例子处理的backgrounding任务虽然。我暂时放弃了这一点,因为它不是那么相似。

要做到这一点,您可以使用PowerShell Jobs。可以用Start-Job或用Invoke-Command -AsJob

看看如何使用工作,并决定是否要花时间应用它只是10回购虽然。