繁体   English   中英

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

[英]Powershell: SVN revert for all files matching a given pattern

我不小心将数十个备份文件添加到SVN,并想递归还原所有与给定模式(*。〜sql)匹配的文件

在UNIX上,我只需使用

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

这是“ 如何将所有未版本控制的文件添加到SVN中”的答案之一的变体

使用Powershell,我想到了

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

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

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

您将需要使用

$_.Split("`t")

作为代码的快速解决方案,因为当前您有一个包含`t的字符串而不是包含一个制表符的字符串,因为单引号的字符串不允许转义序列( ""除外)。 string.Splitchar[]作为参数,并在您传递的任何字符处进行分割,因此在这种情况下,它以重音符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*

我猜也应该起作用。

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

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

(nb $ _是一个matchinfo,它转换为字符串)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM