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



Alrighty。。

所以我正在编辑一个AutoIt脚本,其中有很多未使用的函数。原作者认为可以添加他/她的包含文件中的所有函数。

起初,我试图使用AutoIt/Site中的工具来删除未使用的函数,但由于一些奇怪的原因,这使得脚本/编译文件变得毫无用处。所以现在我想最好写一个函数移除器。

以下是我迄今为止所拥有的:搜索具有"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
}
}

我想做的是删除该函数,可能使用regex。所以类似于:删除"Func_"$Func*"EndFunc">

问题是,这是一个跨越多行的搜索,从Func_NAMEOFFUCTION到EndFunc。我不清楚PowerShell中的regex是否能做到这一点。并非所有regex实现都能够跨行搜索。regex就是答案吗?我不知道。

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

$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参数可以匹配文件中的多个函数定义。

这里有一个正则表达式,应该与AutoIt函数定义相匹配。它假设FuncEndFunc关键字总是放在一行的开头,并且它们区分大小写。函数名称在名为FuncName的组中捕获(在C#中,您可以通过Groups["FuncName"]访问它);

"(?m)^Funcs+b(?<FuncName>_w+b).*n(?:(?!EndFuncb).*n)*EndFunc.*n?"

对于单独的函数名称,您可以使用"b_w+b""b_[A-Za-z]+b";我不知道你需要多严格)。由于对PowerShell几乎没有任何经验,我可能会使用[regex]::Matches[regex]::Replace来完成这项工作。我不知道PS是否提供了更好的方式。

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

最新更新