Powershell:SVN恢复与给定模式匹配的所有文件

时间:2012-05-22 09:21:12

标签: svn powershell windows-7

我不小心将几十个备份文件添加到SVN,并希望以递归方式还原与给定模式匹配的所有文件(* .~sql)

在UNIX上,我只是使用

svn revert `svn status .|grep "~sql$"|awk '{print $2}'`

这是How do I 'svn add' all unversioned files to SVN?

的答案之一的变体

使用Powershell,我想出了

svn status|findstr "~sql" | %{ $_.Split('`t')[1]; }

但这似乎削减了文件名的第一个字符 (例如,我得到ch_sys .~sql而不是scratch_sys .~sql)。

我在这里缺少什么?还是有更多的Powershellish方式来做到这一点?

2 个答案:

答案 0 :(得分:5)

您需要使用

$_.Split("`t")

作为代码的快速修复,因为目前您有一个包含`t的字符串而不是包含制表符的字符串,因为单引号字符串不允许转义序列(""除外)。 string.Split获取一个char[]作为参数,并在您传递的任何字符处进行拆分,因此在这种情况下,它会分割为严重重音和t

但你是对的,这不是真正的PowerShell-y方式。首先,您正在使用具有大量PowerShell等价物的findstr,例如

svn status | where { $_ -match '~sql' }
(svn status) -match '~sql'

从PowerShell使用SVN时,您还有另一种选择。大多数SVN命令都可以输出XML,它通常比文本输出更容易处理。

([xml](svn status --xml)).status.target.entry |
  select -exp path |
  where {$_ -match '~sql'} |
  foreach { svn revert $_ }

这是否更漂亮可能是有争议的,但我更喜欢在可能的情况下使用结构化数据。

然而,

svn revert -R *~sql*

也应该有效。我想。

答案 1 :(得分:0)

如果您使用Select-String,别名sls,您也可以使用正则表达式进行匹配。

([xml](svn status --xml)).status.target.entry.path | sls ".+sql" | %{svn revert $_}

(n.b。$ _是一个被转换为字符串的matchinfo)