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)
但由于显而易见的原因,它不喜欢这样.
您正在寻找的cmdlet是Push-Location和Pop-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立即过滤目录.
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |