-1

よし..

そこで、未使用の関数がたくさん含まれている AutoIt スクリプトを編集しています。元の作成者は、自分のインクルード ファイルからすべての機能を追加するのに適していると考えました。

最初は、AutoIt/SciTe 内のツールを使用して未使用の関数を削除しようとしましたが、奇妙な理由により、スクリプト/コンパイル済みファイルが役に立たなくなりました。だから今、関数リムーバーを書くのが最善だと思っています。

ここに私がこれまでに持っているものがあります: 「Func _」で行を検索し、その関数がファイルに表示される回数を数えます。1回の場合は文字列を選択

$FileName=".\FILENAME.au3"
$File=Get-Content $FileName
$Funcs=$File|Select-String "Func _"
foreach ($Func in $Funcs) {
    $FuncName=$Func.ToString().Split('( ')[1]
    $Count=($File|Select-String $FuncName | Measure-Object).Count
    if ($count -eq 1) {
        $File|Select-String "Func _" $FuncName
    }
}

私がやりたいのは、おそらく正規表現を使用して関数を削除することです。次のようなものです: REMOVE "Func _"$func * "EndFunc"

問題は、これが Func _NAMEOFFUCTION から EndFunc までの複数行にわたる検索であることです。PowerShellの正規表現でこれができるかどうかは私にはわかりません。すべての正規表現の実装が検索を複数の行にまたがることができるわけではないようです。正規表現は答えですか?知らない。

4

2 に答える 2

1

PowerShell 1.0 または 2.0 で Get-Content を使用すると、文字列の配列 (行ごとに 1 つ) しか取得できません。複数の行にまたがる正規表現が必要な場合、これは機能しません。このアプローチを使用して、ファイルを単一の文字列として読み取ります。

$FileContent = [io.file]::ReadAllText($FileName)

PowerShell V3 を使用している場合は、-Rawパラメーターを使用して、ファイルを単一の文字列として読み取ることができます。

$FileContent = Get-Content $FileName -Raw

次に、Select-String を使用する場合、regex を変更して singleline s(およびおそらく multiline m) モードを有効にする必要があります。

$FileContent | Select-String "(?smi)$FuncName" -AllMatches

iは大文字と小文字を区別しないことに注意してください。パラメータを使用して-AllMatches、ファイル内の複数の関数定義を一致させます。

于 2012-10-01T19:38:22.713 に答える
0

AutoIt 関数定義に一致する正規表現を次に示します。FuncandEndFuncキーワードは常に行の先頭に配置され、大文字と小文字が区別されることを前提としています。関数名は、指定されたグループに取り込まれFuncNameます (C# では、Groups["FuncName"] を介してアクセスします)。

"(?m)^Func\s+\b(?<FuncName>_\w+\b).*\n(?:(?!EndFunc\b).*\n)*EndFunc.*\n?"

関数名だけでは、"\b_\w+\b"または多分"\b_[A-Za-z]+\b";を使用できます。どこまで厳しくする必要があるのか​​わからない)。PowerShell の経験がほとんどないので、おそらく and を使用して作業を行うでしょ[regex]::Matches[regex]::Replace。PSがより良い方法を提供しているかどうかはわかりません。

@Keithが提案したように、ファイル全体を文字列に読み取ったと仮定しています。最初に行っていたように行ごとではありません。

于 2012-10-02T00:29:05.030 に答える