我想在给定目录的所有子目录中初始化存储库。由于其中大约有 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"
}
}
显然,我错过了使用循环中每个子目录的一行。在目前的形式中,我相信所有这些都在同一个目录(“.”)中一遍又一遍地调用“git init”,那么从每个子目录内部调用 git init 的方法是什么?有没有办法临时“cd”到每个找到的子目录中?
我尝试了一些天真的东西
& $item.Name + "\git init"
但它不喜欢那样,原因很明显。
最佳答案
您正在寻找的 cmdlet 是 Push-Location
和 Pop-Location
。前者会将当前工作目录更改为您传递给它的任何参数。旧位置将存储在堆栈中。使用 Push-Location
更改目录后,您可以在本地执行命令,就像手动 cd 到它们一样。之后调用 Pop-Location
清栈,回到原来的目录。
顺便提一句。请注意,检查 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
立即过滤目录。关于windows - 在所有子目录中调用 git init 的 Powershell 脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20753197/