2

私は大量の (~2000) .csproj ファイルを扱っています。この開発スタッフには、ビルド プロセス中に物事を移動するために、ビルド後のイベントに xcopy を埋め込む歴史的な前例があります。ビルドの知識を 1 か所にまとめるために、自動ビルド プロセスでの宣言型ビルド アクションを優先して、これらの xcopy 呼び出しを根絶することに取り組んでいます。

そのことを念頭に置いて、xcopy に提供されるパス引数を切り取るために使用できる正規表現を考え出そうとしています。ステートメントにはいくつかの種類があります。

xcopy /F /I /R /E /Y "..\..\..\Microsoft\Enterprise Library\3.1\bin"
xcopy /F /I /R /E /Y ..\Crm\*.* .\
xcopy ..\NUnit ..\..\..\output\debug /I /Y

具体的には:

  • スイッチの予測不可能な配置
  • 宛先パス引数が常に指定されているとは限りません
  • パス引数が引用符で囲まれることがある

私は正規表現のウィザードではありませんが、これは私がこれまでに得たものです (括弧の過度の使用は、powershell で一致を保存するためです:

(.*x?copy.* '"?)([^ /'"]+)('"/.* '"?)([^ /'"]+)('"?.*)

([^ /'"]+)セクションは、引用符、スペース、またはスラッシュを含まない文字列として定義されている、パス引数にするつもりの部分ですが、2 つの正規表現を適用する必要があると感じています (1 つはスペースで引用符で囲まれたパス用) 。および引用符なしのパス用の 1 つ)

残念ながら、この正規表現を実行すると、最初と 2 番目のパス引数の両方に同じ一致が得られるようです。最もイライラします。

これを修正するにはどうすればよいですか?

4

2 に答える 2

2

パスを一致させるために2つの異なるパターンは必要ないと思います。

次のパターンは、指定した3つのケースすべての単一のステートメントと一致する必要があります。

\ A(xcopy)\ s +([\ / AZ \ s] *)\ s *(( "。*?")|([^ \ s] *))\ s *(( "。*?")| ([^ \ s] *))\ s *([\ / AZ \ s] *)

さまざまな組み合わせでパスを照合するためにまたは( )を使用しました。|

現在、Windowsを使用していないため、Linuxルビーでこのパターンをテストしていますが、構文に違いはないか、少なくともアイデアが得られるはずです。

于 2011-05-13T18:10:43.730 に答える
2

このような場合、私は PowerShell の引数解析システムを活用したいと考えています。単純な正規表現を使用して xcopy 行全体を取得し、それを関数で実行します。

$samples = 'xcopy /F /I /R /E /Y "..\..\..\Microsoft\Enterprise Library\3.1\bin"',
    'xcopy /F /I /R /E /Y ..\Crm\*.* .\',
    'xcopy ..\NUnit ..\..\..\output\debug /I /Y'

function argumentgrinder {
    $args | Where-Object {($_ -notlike "/*") -and ($_ -ne "xcopy")}
}

$samples | foreach { Invoke-Expression "argumentgrinder $_"}

ただし、パス内の PowerShell 変数のように見えるもの ( $@および括弧) には注意する必要があります。

于 2011-05-14T02:54:42.190 に答える