一旦您拥有 powershell,我就可以提供完整的脚本来将工作副本升级到 1.7
$prev = "^$"
$workingCopies = Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\" |?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false} |%{$prev=$_.Fullname.TrimEnd(".svn"); $prev}
foreach($copy in $workingCopies)
{
&"C:\Program Files\TortoiseSVN\bin\svn.exe" upgrade $copy;
}
我对“系统卷”目录的访问权限没有问题(这只是偶然的,因为我将所有源存储在一个我拥有完全权限的文件夹中..)。
至于您的执行策略问题 - 这里有一个很好的技巧来避免来回设置它。
您可以使用特殊选项运行 powershell,以避免执行策略、用户特定配置文件设置(可能因不同原因而损坏)等问题:
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Unrestricted -File “C:\Projects\ConvertSvnToVersion17.ps1”
我还可以澄清这个脚本到底做了什么(如果您有兴趣):
$prev = "^$"
将 $prev 初始化为空匹配正则表达式 - ^$ 永远不会匹配任何含义值(除了 startline-endline)。这是通过初步检查所必需的
Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\"
获取名称为“.svn”的所有对象(在我们的例子中 - 名称为“.svn”的所有文件和文件夹),从 Path 开始,递归地。
并将其传送到下一个构造:
?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}
?{...statements... } 是“Where-Object”cmdlet 的快捷方式,$_ 是寻址管道中“每个”条目的方式。
它可以被重写为类似
foreach($entry in $entriesFromSomewhere)
{
If($entry.PSIsContainer -eq $true -and $entry.Fullname.StartsWith($prev) -eq $false)
{
"If entry is directory" and "fullname not start with value from $prev"
...Pass entry to next construct...
}
}
但为了简洁起见,我把它写成一句话
%{$prev=$_.Fullname.TrimEnd(".svn"); $prev}
%{} 是 Foreach =) 的快捷方式
这个构造做了两件事:
- 将不带“.svn”尾部的文件夹全名分配给 $prev
- 将 $prev 进一步传递到下一个管道接收器。
并将整个结果集作为数组分配给 $workingCopies(任何超过 1 项的结果都将是数组)
foreach($copy in $workingCopies)
{
&"C:\Program Files\TortoiseSVN\bin\svn.exe" upgrade $copy;
}
Foreach 数组中的元素 - 执行命令(& 表示“作为命令执行”)“...\svn.exe 升级”
这里所有的魔力都在于回溯 $prev 元素:
在第一个“.svn”条目上 $prev 包含不匹配的值,因此首先检查“where”将减少为“如果条目是目录”。然后分配步骤将放置文件夹父目录。前任。如果发现目录全名是c:\projects\project1.root\trunk.svn- $prev 将被分配给“c:\projects\project1.root\trunk\”。
这个技巧将帮助我们过滤所有较低级别的 .svn 目录:c:\projects\project1.root\trunk\SubProject1.svn条目 - 将无法通过检查“不以 $prev 开头”
这样我们将只过滤第一级 .svn 目录,因为所有嵌套的 .snv 将被过滤StartsWith($prev) -eq $false
所以它非常简单,但看起来有些神奇 =)
顺便说一句,谢谢您在这里的回答 - 您的努力极大地启发了我写这篇评论并澄清整个脚本。
语法极客应该被召集到这个评论来清理和改写我的“所谓的英语”;)