Powershell脚本在所有子目录中调用git init

sta*_*uxe 3 windows git directory powershell

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

 $items = Get-ChildItem -Path "."

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

显然我错过了一个我在循环中使用每个子目录的行.在目前的形式中,我相信所有这一切都在同一目录(".")中反复调用"git init",那么从每个子目录中调用git init的方法是什么?有没有办法暂时"cd"到找到的每个子目录?

我尝试过天真的样子

& $item.Name + "\git init"
Run Code Online (Sandbox Code Playgroud)

但由于显而易见的原因,它不喜欢这样.

pok*_*oke 5

您正在寻找的cmdlet是Push-LocationPop-Location.前者会将当前工作目录更改为您传递给它的任何参数.旧位置将存储在堆栈中.使用后更改目录后Push-Location,可以在本地执行命令,就像手动进入命令一样.然后,调用Pop-Location清除堆栈并返回原始目录.

顺便说一句.请注意,检查Attributes相等性"Directory"不一定足以识别目录.虽然您可以确定只能使用它找到目录,但可能还有其他目录也设置了其他属性标志.另请参见FileAttributes枚举.

检查目录的更好方法是检查PSIsContainer属性.它对于目录来说就是真的,否则就是假的.

使用PowerShell的管道,您也可以将它们全部写在一行中:

Get-ChildItem | ? { $_.PSIsContainer } | % { Push-Location $_.FullName; git init; Pop-Location }
Run Code Online (Sandbox Code Playgroud)

这将首先获取当前目录中的所有项目并将它们推入管道.然后将对目录进行过滤(?过滤器),然后对管道中剩余的每个项目执行命令(对于每个项目%都是如此).所以你打电话Push-Location到目录的位置,git init在那里打电话,然后再回去使用Pop-Location.

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