1

我正在替换我们的日志记录功能,手动浏览所有代码并替换它需要很长时间。

这是当前代码:

错误信息

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "AddContextMenuItem", MessageType.mtErrorMessage, "Null MenuItem provided. MenuItem's status not changed");

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "enableDisableToolbarItem", MessageType.mtErrorMessage, "Invalid toolbaritem provided.");

例外

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "enableDisableContextMenuItem", MessageType.mtException, ex);

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "AddToolbarItem", MessageType.mtException, exc);

有没有一种简单的方法来创建宏(以前从未使用过宏)或 power shell 或 notepad++ 脚本或其他东西来查找和替换所有这些不同的实例,使它们看起来如下所示:

新的错误信息

logger.Log(LogLevel.Error, CLASS_NAME + " AddContextMenuItem - Null MenuItem provided. MenuItem's status not changed");

logger.Log(LogLevel.Error, CLASS_NAME + " enableDisableToolbarItem - Invalid toolbaritem provided.");

新例外

logger.Log(LogLevel.Exception, CLASS_NAME + " enableDisableContextMenuItem - " + ex);

logger.Log(LogLevel.Exception, CLASS_NAME + " AddToolbarItem - " + exc);

我正在替换整个项目中的代码,它只会花费太长时间来手动手动更改所有日志记录代码。任何帮助是极大的赞赏。

4

2 回答 2

3

有几个选项:

  1. Visual Studio 中的正则表达式搜索和替换:

    搜索异常示例

    \w+logger.LogMessage\([^,]+,([^,]+),([^,]+),[^,]+,([^\",]+)\);
    

    代替

    logger.Log(LogLevel.Exception, $1 + $2 + $3);
    
  2. 使用Resharper 结构搜索和替换

  3. 为 Roslyn构建CodeFix
于 2018-04-19T13:45:32.947 回答
1

是的,您可以使用正则表达式来执行此操作,在 PowerShell 中可能比在 Notepad++ 或 VSCode 中更容易。

从您的示例中很难准确地看出您在每个项目中所做的更改,但基本概念是执行以下操作:

  1. 匹配确定要更改的项目类型的静态文本
  2. 还将变量文本与包含在 CAPTURING 括号中的通配符 (.* 等) 匹配
  3. 使用 $1、$2 等对捕获组(或 $Matches[1] 等)的反向引用替换为新的静态文本和“重新排列”的变量文本

如果#3 更复杂,您需要在替换之前进一步更改变量文本——这是脚本语言优于纯搜索和替换的地方。

这是一个简化的示例(PowerShell,但在其他支持正则表达式的语言或编辑器中类似),用于在交换 Param1 和 Param2 的顺序并根据这些参数的原始名称更改名称时静态替换“FunctionOldName”:

"Function_OldName Param1 Param2" -replace 'Function_OldName\s+(\w+)\s+(\w+)', 
                                          'NewFunctionName New$2Parm New$1Parm' 

$1 和 $2 分别是匹配字符串中“1st parens”和“2nd parens”的反向引用。

如果您可以写出清晰的示例,显示您更改的文本的哪些部分必须匹配、简单地更改、重新排列或重建,那么可能会向您展示一些更相关的示例......

您可以使用 PowerShell 或编辑器对多个文件执行此操作,但通常在编程语言(例如 PowerShell)中对多个文件执行此操作会更容易一些。

Get-ChildItem *.PS1 -recurse | ForEach-Object { 
  'Function_OldName\s+(\w+)\s+(\w+)',   # your match goes here
  'NewFunctionName New$2Parm New$1Parm' # your replacement goes here
}
于 2018-04-19T13:36:50.717 回答