如何替换 VS 2017 中的类似代码。

How to replace similar code in VS 2017.

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

这是当前代码:

错误信息:

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);

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

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

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

  1. 匹配创建要更改的项目类型的静态文本
  2. 也将可变文本与包含在 CAPTURING 括号中的通配符(.* 等)匹配
  3. 使用 $1、$2 等对捕获组(或 $Matches[1] 等)的反向引用,用新的静态文本和 'rearranged' 可变文本替换

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

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

"Function_OldName Param1 Param2" -replace 'Function_OldName\s+(\w+)\s+(\w+)', 
                                          'NewFunctionName NewParm NewParm' 

$1 和 $2 分别是对匹配字符串中“第一个括号”和“第二个括号”的反向引用。

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

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

Get-ChildItem *.PS1 -recurse | ForEach-Object { 
  'Function_OldName\s+(\w+)\s+(\w+)',   # your match goes here
  'NewFunctionName NewParm NewParm' # your replacement goes here
}

有几个选项:

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

    搜索异常示例

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

    替换

    logger.Log(LogLevel.Exception,  +  + );
    
  2. 使用Resharper structural Search & Replace

  3. 建立一个CodeFix for Roslyn