Как я могу использовать регулярные выражения, чтобы разделить операторы xcopy, встроенные в файлы .csproj? - PullRequest
2 голосов
/ 13 мая 2011

Я работаю с кучей (~ 2000) файлов .csproj, и в этом коллективе разработчиков есть исторический прецедент для встроенной xcopy в событиях после сборки, чтобы изменить положение вещей во время процесса сборки. Чтобы собрать знания в одном месте, я работаю над устранением этих вызовов 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 ]

2 голосов
/ 14 мая 2011

В подобных случаях мне нравится использовать систему анализа аргументов 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 в путях ($,@ и скобки).

2 голосов
/ 13 мая 2011

Я не думаю, что вам нужны два разных шаблона, чтобы соответствовать путям.

Следующий шаблон должен соответствовать каждому отдельному утверждению во всех трех предоставленных вами случаях:

\A(xcopy)\s+([\/A-Z\s]*)\s*((".*?")|([^\s]*))\s*((".*?")|([^\s]*))\s*([\/A-Z\s]*)

Я использовал или (|) для сопоставления путей в различных комбинациях.

ПРИМЕЧАНИЕ Поскольку в данный момент у меня нет окон, я тестировал этот шаблон на моем linux ruby ​​, но синтаксис не должен отличаться или, по крайней мере, должен дать вам идея.

...