2

誤って数十のバックアップファイルをSVNに追加し、特定のパターンに一致するすべてのファイルを再帰的に元に戻したい(*。〜sql)

UNIXでは、単純に

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

これは、バージョン管理されていないすべてのファイルをSVNに「svnadd」する方法の1つのバリエーションです。

Powershellを使用して、私は思いついた

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

しかし、これはファイル名の最初の文字をカットしているようです(たとえば、scratch_sys。〜sqlの代わりにch_sys。〜sqlを取得します)。

ここで何が欠けていますか?それとも、これを行うためのより強力な方法がありますか?

4

2 に答える 2

6

あなたは使用する必要があります

$_.Split("`t")

`t一重引用符で囲まれた文字列ではエスケープシーケンスが許可されていないため、現在、タブを含む文字列ではなく、を含む文字列があるため、コードの簡単な修正として""string.Splitas引数を取得し、char[]渡した文字のいずれかで分割されるため、この場合、アクサングラーブと。で分割されtます。

しかし、あなたは正しいです、それは実際にはこれを行うためのPowerShellのような方法ではありません。まず、findstrPowerShellに相当するものがたくさんあるものを使用しています。

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、alias slsを使用する場合は、マッチングに正規表現を使用することもできます。

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

(nb $ _は文字列に変換されるmatchinfoです)

于 2016-08-29T10:32:30.530 に答える