-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
    }
}

我想做的是删除该函数,可能使用正则表达式。像这样:删除“Func _”$func *“EndFunc”

问题是这是一个跨越多行的搜索,从 Func _NAMEOFFUCTION 到 EndFunc。我不清楚 PowerShell 中的正则表达式是否可以做到这一点。并非所有正则表达式实现似乎都能够跨行搜索。正则表达式甚至是答案吗?我不知道。

4

2 回答 2

1

当您在 PowerShell 1.0 或 2.0 中使用 Get-Content 时,您只能返回一个字符串数组 - 每行一个。当您需要正则表达式跨越多行时,这将不起作用。使用这种方法将文件作为单个字符串读取:

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

如果您使用的是 PowerShell V3,则可以使用该-Raw参数将文件作为单个字符串读取:

$FileContent = Get-Content $FileName -Raw

然后,当您使用 Select-String 时,您将需要修改正则表达式以启用单行s(可能还有多行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 的使用经验几乎为零,我可能会使用[regex]::Matches[regex]::Replace完成这项工作。我不知道 PS 是否提供了更好的方法。

我假设您已按照@Keith 的建议将整个文件读入字符串,而不是像最初那样逐行读取。

于 2012-10-02T00:29:05.030 回答