0

我在 C# 类上运行了以下 powershell 脚本,以便用空构造函数替换构造函数。我正在对许多自动生成的文件执行此操作。

$nl = [Environment]::NewLine
foreach($item in Get-ChildItem $path) {            
        if($item.extension -eq ".cs") {

            $name = $item.name
            $name = $name.replace('.cs', '')
            $reg = '(public ' + $name + '\(.*?\})'
            $constructorString = [regex]$reg
            $emptyConstructor = 'public ' + $name + '()' + $nl + '{' + $nl + '}' + $nl


            Get-Content $item.fullname -Raw | Where-Object { $_ -match $constructorString } | ForEach-Object { $_ -replace $constructorString, '$1'}            
        }
}

这些类有一种形式

public Bar()
{
    this.foo = new Foo();
}

这导致没有匹配项,如果需要更多信息,请告诉我。

4

1 回答 1

2

无需将模式转换为正则表达式。尝试这个:

$item | Get-Content -raw | Where {$_ -match "(?s)(public\s+${name}\s*\(.*?\})"} | ...

我相信您遇到的问题是,尽管您已使用-Raw参数将 C# 文件作为单个字符串读取,但除非您在正则表达式中使用单行模式,否则字符串中的换行符.*不会遍历。这就是它的(?s)作用。

此外,如果您使用的是 PowerShell V3,则可以使用 basename 而不是替换,例如:

$name = $item.basename

顺便说一句,您是否将Roslyn视为正则表达式搜索/替换方法的替代方法?Roslyn 将为每个源文件构建一个 AST。有了它,您可以轻松找到默认构造函数并将其替换为空构造函数。

于 2013-10-03T03:36:36.663 回答