Autor Beitrag
braincom654
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Fr 21.02.14 15:23 
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:

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


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

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function Test
{
    if($test1)
    {
       Get-Host
    }
    MyOneLineCodeWhichIHaveToInsertHereAtTheEnd
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: braincom654
braincom654 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: 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: blogs.msdn.com/b/pow...more-productive.aspx

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

ausblenden 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:

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