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*\(.*?\})"} | ...

あなたが遭遇している問題は、パラメーターを使用してC#ファイルを単一の文字列として読み取ったにもかかわらず、正規表現で単一行モードを使用しない限り-Raw、文字列に改行がないことだと思います。.*それが のすること(?s)です。

また、PowerShell V3 を使用している場合は、置換の代わりに basename を使用できます。

$name = $item.basename

ところで、正規表現の検索/置換アプローチの代替としてRoslynを見たことがありますか? Roslyn は、ソース ファイルごとに AST を作成します。これにより、デフォルトのコンストラクターを簡単に見つけて、空のコンストラクターに置き換えることができます。

于 2013-10-03T03:36:36.663 に答える