2012-10-01 37 views
0

Alrighty刪除在AutoIt腳本使用的功能..使用PowerShell

所以我編輯,有很多的未使用它功能的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中的正則表達式是否可以執行此操作。並非所有的正則表達式實現似乎都能跨越多行搜索。甚至是正則表達式的答案?我不知道。

回答

1

當您在PowerShell 1.0或2.0中使用Get-Content時,只能找回一個字符串數組 - 每行一個。當你需要一個正則表達式來跨越多行時,這是行不通的。使用此方法來讀取該文件作爲一個字符串:當

$FileContent = Get-Content $FileName -Raw 

然後你:

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

如果您對PowerShell的V3則可以使用-Raw參數讀取文件作爲一個字符串使用選擇字符串,你將需要修改的正則表達式,使單線s(也可能多m)模式,如:

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

注意i是不區分大小寫的。使用-AllMatches參數來匹配文件中的多個函數定義。

+0

這聽起來不對。我並不熟悉PowerShell,但是我知道正則表達式,並且我看不出Singleline *或* Multiline模式如何相關。實際上,最好通過添加'-SimpleMatch'參數來將'$ FuncName'作爲一個字符串而不是正則表達式。 –

+0

如果你需要一個正則表達式來跨越多行,那麼通常匹配換行符(即單行模式)是非常重要的。如果您需要匹配字符串內某一行的開頭(或結尾),則Multiline纔是重要的。在單個字符串中包含要匹配的行也很重要。 –

+0

順便說一句,你假定PowerShell是否可以跨線執行正則表達式。我在說可以。 :-) –

0

這是一個應該匹配AutoIt函數定義的正則表達式。它假定FuncEndFunc關鍵字始終放在行的開頭,並且區分大小寫。函數名稱被捕獲在名爲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建議的字符串中,而不是像原來那樣一行一行。