none
Header in allen .cs files eines Ordners + Unterordner einfügen RRS feed

  • Frage

  • Hallo,

    ich habe folgendes Problem:

    Ich habe einen Ordner der mehrere Unterordner enthält.
    Diese Ordner enthalten mehrere .cs files in denen ich einen header (z.B. Copyright) einfügen will.
    Da ich mir ein Skript schreiben will, womit ich das ganze automatisere, will ich mir das durch ein Powershell Skriptfile vereinfachen.

    Allerdings habe ich erst mit Powershell angefangen und komme noch nicht so ganz klar und viel Zeit um mich intensiv einzuarbeiten ist auch nicht mehr.
    Hier mein bisheriger Versuch:

    $quellpfad = "C:\IsDoc5"
    $endung = "*.cs"

    $dat = gci -Path $quellpfad -Include $endung -Recurse

    foreach ($file in $dat)
    {
           if ($dat -like  "*.cs")
           {              
            }
    }

    Soweit bin ich bisher gekommen, aber ich weiß nicht ob das soweit richtig ist.
    Außerdem ist meine Frage, wie ich in meinem Ja-Zweig einen Befehl einfüge, der mir einen bestimmten Text in jeder .cs file im ordner als "header" festlegt.

    Ich komme mit der Syntax noch nicht so ganz klar deswegen wäre ich über jede Hilfe und jeden Fehler den ihr seht sehr dankbar!

    Grüße
    froehlia


    • Bearbeitet froehlia Dienstag, 27. September 2011 09:10
    Dienstag, 27. September 2011 09:01

Antworten

  • Bitte erst nicht-produktiv testen:

    $quellpfad = "C:\IsDoc5"
    $endung = "*.cs"
    $header = "C:\header.txt"
    
    $headertext = get-content $header
    
    $dat = gci -Path $quellpfad -Include $endung -Recurse
    
    foreach ($file in $dat)
    {
     $oldtext = get-content $file
     $newText = $headertext + $oldtext
     set-content $file $newText
    }
    

    Den Header speicherst du in einer TXT-datei.

    Grüße, Denniver

     

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Dienstag, 27. September 2011 09:42
    Moderator
  • Du musst mir das nicht begründen. Das hier geht auch:

    $quellpfad = "D:\tmp\test"
    $endung = "*.xml"
    $header = "d:\header.txt"
    
    $headertext = get-content $header
    $allfiles = gci -Path $quellpfad -Include $endung -Recurse
    
    foreach ($file in $allfiles) {
    	$olddata = get-content $file
    	
    	Set-Content $file $olddata[0]   # schreibe erste zeile wieder zurück
    	Add-Content $file $headertext # füge füge header-kommentar hinzu
    	
    	foreach ($line in ($olddata[1..$olddata.Count])) {  # erste Zeile auslassen
    		  Add-Content $file $line 				# füge Zeile hinzu
    	 }
    }
    
    

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Samstag, 8. Oktober 2011 09:44
    Moderator

Alle Antworten

  • Die Frage ist, wie deine *cs - Dateien aufgebaut sind. Sind das Textdateien? Was meinst du genau mit Header bzw. wie soll dieser Aussehen?

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Dienstag, 27. September 2011 09:17
    Moderator
  • Hallo Denniver,

    die *.cs - Dateien sind Textdateien - diese bearbeite ich mit dem Notepad++.

    Der header soll eine Kopfzeile sein die in jedem dieser *.cs files eingefügt werden soll.
    Der header soll so aussehen:

    //---------------------------------------------------------------------------
    //Copyright (c) froehlia. All rights reserved.
    //---------------------------------------------------------------------------
    //Redistribution and use in source and binary forms, with or without
    //modification, is not permitted.
    //---------------------------------------------------------------------------
    //Initial revision..: June, 2010
    //---------------------------------------------------------------------------



    • Bearbeitet froehlia Dienstag, 27. September 2011 09:34
    Dienstag, 27. September 2011 09:25
  • Bitte erst nicht-produktiv testen:

    $quellpfad = "C:\IsDoc5"
    $endung = "*.cs"
    $header = "C:\header.txt"
    
    $headertext = get-content $header
    
    $dat = gci -Path $quellpfad -Include $endung -Recurse
    
    foreach ($file in $dat)
    {
     $oldtext = get-content $file
     $newText = $headertext + $oldtext
     set-content $file $newText
    }
    

    Den Header speicherst du in einer TXT-datei.

    Grüße, Denniver

     

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Dienstag, 27. September 2011 09:42
    Moderator
  • Habs gerade eben in einem Testverzeichnis ausprobiert.
    Hat wunderbar geklappt - Vielen Dank!

    Noch eine Frage: Da ich das selbe auch für .xml mache muss ich diesen header hier in die zweite Zeile einfügen.
    Kannst du mir hier auch nochmal helfen?

    Bisher warst du mir auf jedenfall eine große Hilfe! Nochmal Dankeschön!

    Edit: Bringt mir da der Befehl Add-Content etwas?

    • Bearbeitet froehlia Mittwoch, 28. September 2011 11:58
    Dienstag, 27. September 2011 12:33
  • Hallo,

    ich klaue mal den Quelltext von Denniver:

    $quellpfad = "C:\IsDoc5"
    $endung = "*.cs"
    $header = "C:\header.txt"
    
    $headertext = get-content $header
    
    $dat = gci -Path $quellpfad -Include $endung -Recurse
    
    foreach ($file in $dat)
    {
     $oldtext = get-content $file
     $newText = $oldtext[0]+ $header + $oldtext[1...$oldtext.count]
     set-content $file $newText
    }
    
    

    Bitte vorher testen. Ich habe es nicht ausprobiert!!!!

     

    Viele Grüße

    Frank


    -- Frank Röder blog.iteach-online.de --
    Mittwoch, 28. September 2011 12:46
  • Hallo Frank,

    erstmal danke das du dir die Mühe machst.

    ich habe es ausprobiert, hat aber leider nicht funktioniert.
    Hier der Fehler der mir angezeigt wird:

    You must provide a value expression on the right-hand side of the '..' operator.

    Grüße
    froehlia

     

    Mittwoch, 28. September 2011 13:26
  • Ich glaube Frank hat den Teil mit "für .xml"übersehen. Den Header in eine XML Datei einzufügen ist etwas komplizierter. Du kannst den nicht einfach irgendwo reinschreiben, wenn die XML-Datei danach noch gültig sein soll. Poste mal den Anfang der XML-Datei (insofern alle gleich aufgebaut sind) und sage in welchen Knoten der Text eingefügt werden soll. 

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 29. September 2011 11:18
    Moderator
  • Das hier ist der Anfang der XMl-Datei:
    <?xml version="1.0" encoding="utf-8"?>

    Alle XML-Files sind so aufgebaut und wirklich alle im Ordner und allen Unterordnern sollen in der zweiten Zeile diese Kopfzeile kriegen.

    Ich habe es unter anderem versucht, die Kopfzeile wie bei den .cs files ganz oben einzufügen, das hat problemlos funktioniert. Also bisher konnte ich da noch keinen Unterschied zu den .cs files machen (außer das diese einen anderen Kommentar brauchen).

    Bevor ichs vergesse: Dateien mit dieser Endung: .sst .xsd sollen auch den Header in der zweiten Zeile haben.

    Das sind alle Infos die ich habe - hoffe du kannst was damit anfangen.

    Grüße
    froehlia


    • Bearbeitet froehlia Donnerstag, 29. September 2011 11:54
    Donnerstag, 29. September 2011 11:36
  • >Ich habe es unter anderem versucht, die Kopfzeile wie bei den .cs files ganz oben einzufügen, das hat problemlos funktioniert.

    Das Einfügen funktioniert auch problemlos, allerdings ist deine XML Datei dann nicht mehr dem Schema entsprechend und die Anwendung die versucht diese XML Dateien auszulesen wird dir einen Fehler melden, wegen "ungültiger Daten".

    Mach es einfach mal und versuche dann mit [xml](get-content c:\meinexml.xml) darauf zuzugreifen, dann siehst du was ich meine.

    Der einzig richtige Weg ist, einen XML-Kommentarblock einzufügen, ein Beispielscript ist hier. Teste es mal und poste wieder wenn du nicht weiterkommst.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 29. September 2011 12:10
    Moderator
  • Also das ist das was ich bisher habe:

    $quellpfad = "C:\IsDoc5"
    param([string]$endung = "*.xml",$header = "C:\header2.txt")


    $headertext = [xml] (get-content $endung)

    $dat = gci -Path $quellpfad -Include $endung -Recurse

    foreach ($file in $dat)
    {
    $root = $headertext.SelectSingleNode("")
    $comment = $headertext.CreateComment($comment)
    $headertext.InsertAfter($comment, $root)
    $outfile = (Split-Path -Parent $endung) + ""
    $doc.save($outfile)
    }

    Die "fett" markierten Sachen sind die Sachen wo ich noch nicht so viel verstehe.
    Bei $root und $outfile weiß ich nicht genau wofür das steht und was es mit dem Inhalt in den " " auf sich hat.

    Mit dem rest bin ich mir auch noch nicht so ganz sicher. Das Beispiel bei dem Link den du mir gezeigt hast (dafür schonmal Danke!) ist das ganze ja nur für eine XML Datei gedacht wenn ich es richtig verstanden habe. Ich habe es versucht in meine Situation umzumünzen, aber ich weiß nicht ob mir das (teilweise) gelungen ist. Testen kann ich es ja leider noch nicht aufgrund des fehlenden Inhalts in den "" und weil ich mir da auch noch nicht sicher bin.

    Grüße
    froehlia

    Donnerstag, 29. September 2011 13:45
  • Ich hab jetzt nochmal eine Lösung auf Basis des ersten Skripts. Ist nicht so elegant wie die Daten als XML zu behandeln, geht aber problemloser und für mehr hab ich jetzt keine Zeit. Das nächste Problem was du auf obige Weise nämlich bekommen würdest, ist das deine Formatierung des Headers flöten geht.

    Das geht: (wie immer erst testen!)

     

    $quellpfad = "E:\tmp"
    $endung = "*.xml"
    $header = "e:\tmp\header.txt"
    
    $headertext = get-content $header
    
    $dat = gci -Path $quellpfad -Include $endung -Recurse
    
    foreach ($file in $dat) {
    	 $oldtext = get-content $file
    	 set-content $file $headertext      # schreibe Header in XML
    	 
    	foreach ($line in ($a[1..$a.Count])) {  # erste Zeile auslassen
    		  Add-Content $file $line 				# füge Zeile hinzu
    	 }
    }
    
    

     


    Ausserdem must die Header.txt ändern, da XML-Daten kein "--" enthalten dürfen und der einfachheit halber schreiben wir die Tagss und die erste Zeile gleich mit rein:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    =============================================================================
    ==Copyright (c) froehlia. All rights reserved.
    =============================================================================
    ==Redistribution and use in source and binary forms, with or without
    ==modification, is not permitted.
    =============================================================================
    ==Initial revision..: June, 2010
    =============================================================================
    -->

     

    Du kannst natürlich auch auch gerne noch mit der XML-Variante spielen und ich schaus mir morgen nochmal an.

    Grüße, Denniver

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Donnerstag, 29. September 2011 14:33
    Moderator
  • Ich habe es ausprobiert, aber der ersetzt die ganze .xml file mit dem header.
    Außerdem musste ich gerade feststellen das doch einige .xml files in den Unterverzeichnissen einen anderen anfang haben als den bisher genannten.

    Ich verstehe natürlich wenn du keine Zeit hast, aber du hast mir schon sehr sehr geholfen bisher.
    Entschuldigung das ich da so viel Zeit beanspruche. :-/

    Falls du Zeit hast kannst du mir gerne weiterhelfen, falls nicht verstehe ich das. =)

    Grüße
    froehlia

    Freitag, 30. September 2011 07:25
  • >ich habe es ausprobiert, aber der ersetzt die ganze .xml file mit dem header.

    Sorry mein Fehler. Zeile 13 muß lauten:

     

    foreach ($line in ($oldtext[1..$oldtext.Count])) { 
    


    Wenn deine XML-Files alle anders aussehen, schlage ich vor die Copyright-Informationen einfach ans Ende zu setzen:

     

    $quellpfad = "D:\tmp\transfer"
    $endung = "*.xml"
    $header = "d:\header.txt"
    
    $headertext = get-content $header
    $dat = gci -Path $quellpfad -Include $endung -recurse
    
    foreach ($file in $dat) { 
         write-host "Bearbeite: " $file.Name
    	 $oldtext = get-content $file
         $newtext = $oldtext + $headertext
    	 set-content $file $newtext     
    
    }
    

     

    Hierbei musst du dann vorher noch die erste Zeile (<?xml version="1.0" encoding="utf-8"?> ) wieder aus der Header.txt entfernen.

    Wenn ich mal die Frage stellen darf: Warum willst du überhaupt Copyrightinfos in einen Filetyp schreiben, der eh quasi nie geöffnet und angesehen- sondern immer nur verarbeitet wird? Das Urheberrecht hast du übrigens eh, ob du es nun reinschreibst oder nicht.

    Grüße, Denniver

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".



    Freitag, 30. September 2011 09:48
    Moderator
  • Guten Morgen Denniver,

    warum das ganze in die zweite Zeile soll und wieso auch in den .xml files, würde ich dir gerne über eine Private Nachricht mitteilen falls das hier möglich seien sollte.

    Der Code funktioniert jetzt soweit wie es eigentlich gedacht war:
    Oben ist der header in der XML-file, ersetzt aber wie erwartet die erste Zeile

    Die Copyrights am Ende der verschiedenen Dokumente wäre mir auch am liebsten, ist aber leider nicht möglich. (Wie gesagt: würde ich dir gerne schreiben aber nicht hier öffentlich) Falls es doch noch so eine Möglichkeit geben sollte das in die zweite Zeile einzusetzen wäre ich sehr dankbar.

    Grüße
    froehlia

    Dienstag, 4. Oktober 2011 07:03
  • Du musst mir das nicht begründen. Das hier geht auch:

    $quellpfad = "D:\tmp\test"
    $endung = "*.xml"
    $header = "d:\header.txt"
    
    $headertext = get-content $header
    $allfiles = gci -Path $quellpfad -Include $endung -Recurse
    
    foreach ($file in $allfiles) {
    	$olddata = get-content $file
    	
    	Set-Content $file $olddata[0]   # schreibe erste zeile wieder zurück
    	Add-Content $file $headertext # füge füge header-kommentar hinzu
    	
    	foreach ($line in ($olddata[1..$olddata.Count])) {  # erste Zeile auslassen
    		  Add-Content $file $line 				# füge Zeile hinzu
    	 }
    }
    
    

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Samstag, 8. Oktober 2011 09:44
    Moderator