2

我不小心将几十个备份文件添加到 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)。

我在这里想念什么?还是有更强大的方式来做到这一点?

4

2 回答 2

6

你需要使用

$_.Split("`t")

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

但你是对的,这并不是真正的 PowerShell 方式。首先,您使用findstr的是具有大量 PowerShell 等效项的,例如

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*

我猜应该也可以。

于 2012-05-22T09:26:55.710 回答
0

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

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

(nb $_ 是一个匹配信息,它被转换成一个字符串)

于 2016-08-29T10:32:30.530 回答