none
Dateien umbenennen

    Frage

  • Ich habe eine Reihe von Raw-Dateien in ein Verzeichnis geschrieben. Der jew. Inhalt stammt aus 12 verschiedenen Log-Dateien.

    Diese raw-Dateien will ich jetzt der Reihe nach aufrufen und in csv-Dateien mit leicht veränderten Daten kopieren.
    Aus der raw-Datei ($raw) will ich den Namen der csv-Datei ($fCsv) bilden - aber das schlägt irgendwie fehl: 

    $stats = "D:\MT5` RemoteTester\Stats"  
    $Raws = Get-ChildItem -path $stats -Filter *.raw 
    foreach($raw in $Raws) { 
        echo "file $raw"                    # => file 20180804.raw, OK!
        $fCsv = $stats+"\"+[String]$raw   
        $fCsv.Replace(".raw", ".csv")     
        echo $fCsv                          # => D:\MT5 RemoteTester\Stats\20180804.csv OK! Die gibt's nicht!
        echo (Test-Path $fCsv)              # => D:\MT5 RemoteTester\Stats\20180804.raw   HUUUUCH???
        if ( Test-Path $fCsv ) { continue } # => continue als ob die csv-Datei existiert
        ...
    }


    Wie kriege ich das hin?

    Ich habe es mit [String] an verschiedenen Orten probiert - trotzdem lande ich immer wieder bei continue.

    Ich habe eben noch einmal das Verzeichnis kontrolliert. Es gibt keine csv-Datei nur 5 raw-Dateien.

    $fCsv ist eine neue Variable in diesem Skript.

    Ich bin ratlos!




    Donnerstag, 9. August 2018 18:41

Antworten

  • Moin,

    $x.Replace("str1","str2")

    verändert den Inhalt von $x nicht. Willst Du ihn verändern, musst Du den Wert zuweisen:

    $x = $x.Replace("str1","str2")

    Somit behaupte ich einfach mal ganz kühn, dass in der vorletzten Zeile von

    $fCsv = $stats+"\"+[String]$raw   
    $fCsv.Replace(".raw", ".csv")     
    echo $fCsv                          # => D:\MT5 RemoteTester\Stats\20180804.csv OK! Die gibt's nicht!
    echo (Test-Path $fCsv)              # => D:\MT5 RemoteTester\Stats\20180804.raw   HUUUUCH???
    
    immer noch ".raw" ausgegeben wird, und die Ausgabe, die Du im Kommentar zitierst, stammt aus der Zeile davor.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert goooly Freitag, 10. August 2018 06:00
    Donnerstag, 9. August 2018 19:30

Alle Antworten

  • Moin,

    $x.Replace("str1","str2")

    verändert den Inhalt von $x nicht. Willst Du ihn verändern, musst Du den Wert zuweisen:

    $x = $x.Replace("str1","str2")

    Somit behaupte ich einfach mal ganz kühn, dass in der vorletzten Zeile von

    $fCsv = $stats+"\"+[String]$raw   
    $fCsv.Replace(".raw", ".csv")     
    echo $fCsv                          # => D:\MT5 RemoteTester\Stats\20180804.csv OK! Die gibt's nicht!
    echo (Test-Path $fCsv)              # => D:\MT5 RemoteTester\Stats\20180804.raw   HUUUUCH???
    
    immer noch ".raw" ausgegeben wird, und die Ausgabe, die Du im Kommentar zitierst, stammt aus der Zeile davor.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert goooly Freitag, 10. August 2018 06:00
    Donnerstag, 9. August 2018 19:30
  • Wie schon im MCSEBoard erwähnt - Du machst Dir das Leben schwerer als nötig. Die Powershell macht ziemlich viel implizit für Dich, ohne dass Du dafür viel tun müsstest. Wenn Du Deine .raw-Dateien umwandeln willst, iterierst Du einfach mit einer Schleife über die enthaltenen Zeilen, wandelst sie so um, wie Du es brauchst und benutzt Export-CSV um valide CSV-Dateien zu erzeugen. Das ist deutlich einfacher als mit Write-Output.

    Dein Scriptgerüst könnte also so aussehen:

    $Path = 'D:\MT5 RemoteTester\Stats'
    Get-ChildItem -Path $Path -Filter *.raw |
        ForEach-Object {
            $DateiName = $_.BaseName
            Get-Content -Path $_.FullName |
                ForEach-Object {
                    "Hier wird $_ in z.B. `$Ergebnis umgewandelt "
                     $Ergebnis | Export-Csv -Path ($Path + '\' + $DateiName + '.csv') -Encoding UTF8 -Append -NoTypeInformation
                }
        }
    Wie üblich, ist da natürlich noch eine Menge Potential für Verbesserungen.  ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Donnerstag, 9. August 2018 23:55
    Donnerstag, 9. August 2018 23:55
  • Danke, das war's: $fCsv = $fCsv.Replace(".raw", ".csv")
    Freitag, 10. August 2018 06:00
  • Das (Get-Content ...) mache ich ja auch später - nur das war nicht mein Problem!

    Außerdem ist meine Version näher zu anderen Programmiersprachen und für mich so leichter und schneller lesbar, zB in 2 Jahren in denen es automatisiert zB einmal wöchentlich läuf.

    Powershell ist für mich halt immer nur mal ein gelegentlicher Ausflug, so dass dessen mit unter ungewöhnlichen Konventionen mir nicht immer sofort präsent sind!




    • Bearbeitet goooly Freitag, 10. August 2018 06:07
    Freitag, 10. August 2018 06:04
  • Hmmmm ... was soll ich dazu noch sagen ... 

    Um mit einer Auto-Analogie zu antworten: Es ist, als ob Du uns bittest, Dir beim Schieben Deines Autos zu helfen, weil es schwer und langsam ist, wenn Du es alleine schiebst. Du hast es früher mit Deinem Tret-Roller auch so gemacht und da hat es immer funktioniert. Wäre es nicht besser, wenn Du Dir erklären lässt, wie man das Auto öffnet, einsteigt und damit losfährt?  ;-) :-D

    Powershell ist für Administratoren gemacht - nicht für Entwickler. Natürlich unterscheidet es sich von anderen Programmiersprachen. Aber es ist für Systemverwaltungsaufgaben üblicherweise mit weniger Code ungleich effizienter als alles andere, was man bisher kennt. Es lohnt sich auf jeden Fall, sich die Grundlagen vernünftig anzueigenen, wenn man vorhat, noch eine Weile in Windows-System-Umgebbungen unterwegs zu sein.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH_666 Freitag, 10. August 2018 11:32
    Freitag, 10. August 2018 06:33
  • Auch als Entwickler sollte man die Powershell nicht verachten.
    Dies ist in vielen Fällen effektiver als die guten alten .bat (Tretroller) oder .vbs/.wsh-Dateien (Golfklasse).
    Da ist die Powershell, gerade durch die Möglichkeiten der .Net-Integration, in vielen Fällen effektiver und leichter.

    Das einzige, was mir dabei noch fehlt, ist das vollständige Unterdrücken des "DOS"-Fensters. Trotz aller Maßnahmen blinkt es immer noch kurz auf.
    Freitag, 10. August 2018 10:04