使用PowerShell删除AutoIt脚本中未使用的函数

时间:2012-10-01 18:37:27

标签: regex powershell powershell-v2.0 autoit

Alrighty ..

所以我正在编辑一个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中的正则表达式是否可以做到这一点。并非所有正则表达式实现似乎都能跨越线条进行搜索。正则表达式甚至是答案吗?我不知道。

2 个答案:

答案 0 :(得分: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参数匹配文件中的多个函数定义。

答案 1 :(得分:0)

这是一个应该与AutoIt函数定义匹配的正则表达式。它假设FuncEndFunc关键字始终位于行的开头,并且它们区分大小写。函数名称在名为FuncName的组中捕获(在C#中,您将通过组[“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建议的字符串,而不是像你原来那样逐行。