2

我正在处理一堆(~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

具体来说:

  • 不可预知的开关位置
  • 并不总是提供目标路径参数
  • 路径参数有时用引号括起来

我不是正则表达式向导,但这是我到目前为止所得到的(过度使用 parenteses 是为了在 powershell 中保存匹配:

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

这些([^ /'"]+)部分是我打算成为路径参数的部分,被定义为不包含引号、空格或正斜杠的字符串,但我觉得我必须应用两个正则表达式(一个用于带空格的引号包裹的路径一个用于无引号路径)

不幸的是,当我运行这个正则表达式时,它似乎为我提供了第一个和第二个路径参数的相同匹配。最令人沮丧。

我将如何改变它来纠正它?

4

2 回答 2

2

我认为您不需要两种不同的模式来匹配路径。

以下模式应与您提供的所有三种情况下的每条语句匹配:

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

我使用( |) 来匹配各种组合中的路径。

注意因为我目前还没有 windows,所以我一直在我的 linux ruby​​ 上测试这个模式,但是语法应该没有什么不同,或者至少应该给你一个想法。

于 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 回答