Entwickler-Ecke

Sonstiges (.NET) - Ende einer Funktion code einfügen


braincom654 - Fr 21.02.14 15:23
Titel: Ende einer Funktion code einfügen
Hallo,
ich habe eine .ps1 file, dort sind functions usw drinen. Nun möchte ich bei einer ganz bestimmten Methode am Ende eine Zeile Code hinzufügen und war auch mit Powershell - Script. Ich weiß jedoch nicht was genau alles in der ps1 file drinen ist, es können viele Funktionen sein oder nur 2 usw.
Die Funktion die ich suche könnte unter Umständen auch gar nicht existieren d.h. ist generiere sie mit meinem Code.
Beispiel, Original ps1 file:


Quelltext
1:
2:
3:
4:
5:
6:
7:
function Test
{
    if($test1)
    {
       Get-Host
    }
}


So sollte sie nach nach ausführung des scriptes aussehen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function Test
{
    if($test1)
    {
       Get-Host
    }
    MyOneLineCodeWhichIHaveToInsertHereAtTheEnd
}


Ralf Jansen - Fr 21.02.14 16:13

Klingt nach simpler Suchen/Ersetzen Textverarbeitung.

a.) Den Text "function Test" suchen.
b.) Wenn gefunden dann folgende geschweifte Klammern zählen. Öffnende addieren, schließende abziehen. Wenn dieser Zähler wieder auf null steht hast du die funktionsschließende gschweifte Klammer gefunden. (Gequotete Klammen ignorieren nicht vergessen)
c.) Denn gesammten Code von "function Test" bis zum gefunden "}" löschen.
d.) Die Methode jetzt wieder, so wie sie eigentlich aussehen soll, anhängen.


braincom654 - Fr 21.02.14 16:49

Hallo Ralf,
richtig simple Lösung sowas wollte ich hören. Danke vielmals! b.) Hat mir gefehlt, ist doch (in nachhinein immer) klar die geschweiften Klammer gehen genau auf. Super, nun zur umsetzung. :)

Schönes Wochnende.


EDIT:

Habe eine elegantere Lösung gefunden: http://blogs.msdn.com/b/powershell/archive/2013/10/30/using-asts-with-ise-to-make-scripting-more-productive.aspx

Hier mein Code der die Zeilennummer zurück gibt, welche am Ende einer gewissen Funktion in ein powershell Script ist.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function GetEndLineNumber($filePath, $functionName)
{
  $NewParser = [System.Management.Automation.Language.Parser] 
  $ParseFile = (Resolve-Path -Path $filePath).ProviderPath 
    $AbstractSyntaxTree = $NewParser::ParseFile($ParseFile, [ref]$null,  [ref]$null)
              
  $functionsInFile = $AbstractSyntaxTree.FindAll({$args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst]}, $true)
  
  $initializeFunction = $null
  foreach($function in $functionsInFile)
  {
    if($function.Name -eq $functionName)
    {
      $initializeFunction = $function
      break
    }
  }
  if($initializeFunction -eq $null){ return 0 }
  
  $initializeFunctionBody = $initializeFunction.Body
  return $initializeFunctionBody.Extent.EndLineNumber
}


Dann etwas dort einzufügen geht in etwa folgender maßen:


C#-Quelltext
1:
2:
3:
$code = Get-Content $filePath
$lineNumber = GetEndLineNumber $filePath "TestFunctionName"
$code[$lineNumber] = "MyCode"