我想在给定目录中的所有子目录中初始化存储库。由于其中大约有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"
但由于显而易见的原因,它不喜欢这样。
答案 0 :(得分:5)
您要查找的cmdlet是Push-Location
和Pop-Location
。前者会将当前工作目录更改为您传递给它的任何参数。旧位置将存储在堆栈中。使用Push-Location
更改目录后,可以在本地执行命令,就像手动插入命令一样。然后,调用Pop-Location
清除堆栈并返回原始目录。
顺便说一下。请注意,检查Attributes
的{{1}}相等性不一定足以识别目录。虽然您可以确定仅使用它来查找目录,但可能还有其他目录也设置了其他属性标志。另请参阅FileAttributes枚举。
检查目录的更好方法是检查"Directory"
属性。它对于目录来说都是正确的,否则就是假的。
使用PowerShell的管道,您也可以将它们全部写在一行:
PSIsContainer
这将首先获取当前目录中的所有项目并将它们推入管道。然后将对目录进行过滤(Get-ChildItem | ? { $_.PSIsContainer } | % { Push-Location $_.FullName; git init; Pop-Location }
是过滤器),然后将对管道中剩余的每个项执行命令(?
为每个项目)。因此,您致电%
以转到该目录的位置,在那里拨打Push-Location
,然后使用git init
返回。
注意:如果您使用的是PowerShell 3,您还可以使用Pop-Location
立即过滤目录。
答案 1 :(得分:1)
您所要做的就是调用此命令:
gci c:\parent\folder | ? { $_.PSIsContainer; } | % { cd $_.FullName; git init; };
Get-ChildItem
的别名,它获取“父文件夹”的子目录和文件列表。它通过pipe
字符|
PSIsContainer
位仅过滤文件夹的“子项目”列表,以便排除文件。它通过管道|
ForEach-Object
的别名,它为PowerShell管道中的每个对象执行一系列任务。
git init
答案 2 :(得分:0)
如果您不想使用推拉定位,则可以使用更简单的戳脚本
Get-ChildItem | ? { $_.PSIsContainer } | % { git -C $_.FullName pull }