为什么此PowerShell脚本从根目录中删除svn:mergeinfo?

时间:2010-10-28 10:31:25

标签: svn powershell

我们有一个脚本可以从Subversion工作副本中的所有文件夹中删除svn:mergeinfo属性,但不能删除工作副本根目录本身。它目前是通过单独的批处理文件调用的NAnt构建脚本,所以我试图用更简单的PowerShell脚本替换它。我有三次尝试,从天真到稍微复杂。这三个都不符合我的标准,输出行property 'svn:mergeinfo' deleted from '.'.

检查工作副本root的SVN属性表明svn:mergeinfo属性确实已从此文件夹中删除,这不是我想要的。每个版本都设计为从工作副本根目录运行。

尝试1:

# I understand why this one fails, it's a poor attempt.
Get-ChildItem -Recurse | svn propdel svn:mergeinfo -R $_

尝试2:

# This one correctly lists everything except the working copy root, but
# still removes the svn:mergeinfo property from the working copy root.
Get-ChildItem -Recurse -Exclude $pwd | svn propdel svn:mergeinfo -R $_

尝试3:

# Again, this one works fine until the svn propdel is added.
Get-ChildItem | ForEach-Object { ls -R $_ } | svn propdel svn:mergeinfo -R $_

有关我的逻辑缺陷在哪里的任何想法?

1 个答案:

答案 0 :(得分:3)

svn是一个外部应用程序,您无法直接使用PowerShell管道技术。我不熟悉svn语法,但对于细节可能有误,但所有命令都应该使用ForEach-Object(%)。那就是:

... | %{ svn propdel svn:mergeinfo -R $_ }

然后svn应正确“理解”$_。此外,您很可能应该使用$_.FullName$_.Name而不是$_之类的内容(同样,因为svn是一个外部应用程序而且它需要一个字符串(例如$_.FullName / $_.Name),而非对象$_)。注意:$_通常会按预期自动转换为字符串,但情况并非总是如此。