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

时间:2018-04-19 13:02:08

标签: powershell visual-studio-2017 notepad++ find-replace

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

以下是当前代码:

错误消息

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

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

2 个答案:

答案 0 :(得分:2)

有几个选择:

  1. 正则表达式搜索&在Visual Studio中替换:

    搜索异常示例

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

    替换

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

  3. 构建CodeFix for Roslyn

答案 1 :(得分:1)

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

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

  1. 匹配建立要更改的项目类型的静态文本
  2. 还将变量文本与CAPTURING括号中的通配符(。* etc)匹配
  3. 替换为新的静态文字并重新排列'使用$ 1,$ 2等反向引用捕获组的变量文本(或$ Matches [1]等)
  4. 如果#3更复杂,您需要在替换之前进一步更改变量文本 - 这是脚本语言优于纯搜索和替换的地方。

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

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

    1美元和2美元是对第一个parens"和"第二个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
    }