2013-12-24 33 views
3

我想要在给定目录中的所有子目录中初始化存储库。由于其中大约有200个(遗留项目),我想用Powershell将其自动化。到目前为止,我有:在所有子目录中调用git init的Powershell脚本

$items = Get-ChildItem -Path "." 

    foreach ($item in $items) 
    { 
      if ($item.Attributes -eq "Directory") 
      { 
       $git = "C:\Program Files (x86)\Git\cmd\git" 
       & $git "init" 
      } 
    } 

显然我缺少一个行,我使用循环中的每个子目录。在目前的形式中,我相信所有这一切都会在同一个目录(“。”)中反复调用“git init”,那么从每个子目录内部调用git init的方式是什么?有没有办法暂时“cd”到找到的每个子目录中?

我试过天真的东西像

& $item.Name + "\git init" 

但它不喜欢的是,出于显而易见的原因。

回答

4

您正在查找的小命令是Push-LocationPop-Location。前者会将当前工作目录更改为传递给它的任何参数。旧的位置将被存储在堆栈中。一旦使用Push-Location更改了目录,就可以在本地执行命令,就好像您手动将它们插入它们一样。之后,致电Pop-Location清除堆栈并返回原始目录。

Btw。请注意,检查Attributes等于"Directory"不一定足以识别目录。虽然您可以确定只会使用查找使用该目录的目录,但也可能有其他目录也设置了其他属性标志。另请参阅FileAttributes枚举。

检查目录的更好方法是检查PSIsContainer属性。对于目录来说,这只会是真的,否则就是错误的。

使用PowerShell的管道,你也可以写在一个单一的线:

Get-ChildItem | ? { $_.PSIsContainer } | % { Push-Location $_.FullName; git init; Pop-Location } 

这将首先获得在当前目录中的所有项目,并将其推入管。然后它们将被过滤以查找目录(?是过滤器),然后将为每个留在管道中的项目执行命令(每个项目为%)。因此,您拨打Push-Location即可前往目录位置,请致电git init,然后再返回Pop-Location

注意:如果您使用的是PowerShell 3,则还可以使用Get-ChildItem -Directory来立即过滤目录。

+0

所以我总Powershell的小白,所以如果我只使用一键定位我的示例脚本的循环在上述范围内,然后弹出地点后,我做我必要的命令,会做同样的事情?这是一个很好的一行,但有点难以阅读。 – starmandeluxe

+0

@starmandeluxe重写了我的答案,希望它有帮助:) – poke

+0

这两个答案看起来不错,但只是修改我当前的脚本,这一个解决方案。谢谢 – starmandeluxe

1

所有你需要做的就是把这个命令:

gci c:\parent\folder | ? { $_.PSIsContainer; } | % { cd $_.FullName; git init; }; 
  1. 的第一位是Get-ChildItem一个别名,其获取的子目录和文件的列表“父文件夹”。它通过pipe字符将这些项目传递到下一个命令|
  2. PSIsContainer位仅筛选文件夹的“子项目”列表,以便排除文件。它通过管道将这些文件夹传递到下一个命令上|
  3. 最后一位是ForEach-Object的别名,它为PowerShell管道中的每个对象执行一系列任务。
    • 将当前位置的文件夹路径
    • 呼叫git init
相关问题