Ankündigung

Einklappen
Keine Ankündigung bisher.

Powershell Hilfe

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Powershell Hilfe

    Hallo,

    Vielleicht kennt sich ja jemand mit powershell aus und kann mir ein kleines Script basteln, mit dem ich Dateien umbenennen kann.

    Grunddatei sieht so aus:

    mir-646_20170515122315.pdf

    So hätte ich es gerne:

    MIR_646.pdf

    Hab zwar was gefunden, aber mein Wissen reicht nicht wirklich aus um das nach meinen Vorstellungen umzumodeln. Handelt sich leider um die Powershell 1.0....

    #2
    Kein Powershell, aber evtl. hilft dir: http://www.bulkrenameutility.co.uk/Main_Intro.php

    Falls du das öfters machen musst, schau mal ob du mit rename-item und regex was hinbekommst.

    Kommentar


      #3
      Zitat von Meeep
      mir-646_20170515122315.pdf

      So hätte ich es gerne:

      MIR_646.pdf
      Du willst also praktisch die ersten 3 Zeichen großgeschrieben haben, dann ein _ statt - und dann die Zeichen 5-7 und .pdf dahinter?

      Kommentar


        #4
        Habs nur mal zusammengegoogelt:

        Spoiler: 

        Get-ChildItem *.pdf | Rename-Item -NewName {$_.Name -replace '_\d{14}', ''}

        Get-ChildItem *.pdf | Rename-Item -NewName {$_.Name -replace '-', '_'}

        Get-ChildItem *.pdf | Rename-Item -NewName {$_.Name.substring(0,3).toUpper()+$_.Name.substrin g(3).toLower()}

        Die drei Befehle nacheinander in dem Ordner ausführen wo die pdfs liegen.
        Setzt voraus, dass die Dateinamen genauso aussehen wie du geschrieben hast! (das \d14 wegen den 14 Ziffern die weg sollen). Mit anderen Namen funktioniert es nicht.
        Auch solltest du keine anderen pdfs in dem Ordner haben, die Befehle nehmen sich alle pdfs in dem Ordner und benennen sie um.

        e: hab's übrigens getestet mit ner Datei die einen Namen hat wie deine.

        Kommentar


          #5
          Kommando zurück. Tut mir echt leid, ein solcher Befehl nimmt wohl immer nur eine Datei und benennt sie um, bei zwei in einem Ordner wirft meine Powershell einen Fehler. Muss nochmal nachschauen...

          e: :D, funktioniert doch ;) Mein Problem war gerade, dass beide Dateien nach Umbenennung den gleichen Namen gehabt hätten. Also aufpassen, dass du nicht mehrere Dateien hast mit mir-123_xxx.pdf und mir-123_yyy.pdf

          Kommentar


            #6
            Vorher:



            Befehl:

            Get-ChildItem *.pdf | Rename-Item -NewName {$_.Name.substring(0,3).toUpper()+'_'+$_.Name.subs tring(4,3)+'.pdf'}

            Nachher:



            Da wird genau das gemacht, was ich oben beschrieben hatte. Er nimmt die ersten 3 Zeichen, schreibt sie groß, dann ein _ und dann die 3 Zeichen danach und .pdf hinten dran.

            Zitat von Hayzle
            Kommando zurück. Tut mir echt leid, ein solcher Befehl nimmt wohl immer nur eine Datei und benennt sie um, bei zwei in einem Ordner wirft meine Powershell einen Fehler. Muss nochmal nachschauen...
            Nope. Der Befehl nimmt alle Items. Fehler liegt woanders. Ansonsten kannst du auch bei \d{14} ein \d* nehmen. Dann ist es egal ob 0 Zahlen oder 100.

            Kommentar


              #7
              Genau so hab ich mir das vorgestellt. Der Scanner hier ist leider mist und fügt automatisch das Datum+Uhrzeit ein.

              Danke euch beiden für die Mühe!

              Kommentar


                #8
                Bin jetzt etwas weiter in diesem "tollen Projekt" und am Ende der noch zu scannenden Formulare angelangt. Mir fällt dabei dann auf, dass immer wieder einzelne Dateien fehlen. Springt dann zB von MIR_321 zu MIR_323. Jetzt ist die Frage, ob ich mit Powershell einen Befehl ausführen lassen kann, der mir die fehlenden Dateien ausgibt. Alle Dateien sind Squentiell von 0001 - 4300(ggf. mehr, sollte aber nicht die größte Hürde darstellen) gelistet.

                Sieht dann manchmal so aus wie der Screenshot von Killa, sollte aber in der Norm nicht so sein. Sondern vollständig (MIR_0321, MIR_0322, MIR_323 usw.). Meine Frage wäre nun, ob es möglich ist mir eine Datei ausgeben zulassen, die alle Fehlenden(!) PDFs aus dem Ordner mit den gesammelten Dateien enthält. Ich meine mich blass an sowas erinnern zu können, aber die 2 Wochen, die ich mal mit Powershell beschäftigt habe, liegen knapp 8 Monate zurück :/

                Kommentar


                  #9
                  quick and dirty

                  $obj=(get-childitem -Path $path).Name.Substring(4,3) |% {$i = 100}{while ($i -lt $_){$i;$i++};$i++}
                  Write-Output "Missing Numbers: $obj"

                  wobei die Zählvariable i die Zahl symbolisiert von der ab gezählt wird. Geht sicher noch dynamisch auszulesen aber was solls...

                  /edit: jetzt dynamisch ausgelesen
                  $obj=(get-childitem -Path $path).Name.Substring(4,3) | Sort-Object
                  [int]$int=$obj[0]
                  $result = $obj |% {$i = $int}{while ($i -lt $_){$i;$i++};$i++}
                  Write-Output "Missing Numbers: $result"

                  Kommentar


                    #10
                    Zeigt mir als Ergebnis nichts an. Als Wert für "i" geb ich meine Startzahl ein, bei mir wäre das die 0001, korrekt?

                    Kommentar


                      #11
                      Zitat von Meeep
                      Zeigt mir als Ergebnis nichts an. Als Wert für "i" geb ich meine Startzahl ein, bei mir wäre das die 0001, korrekt?
                      Nimm den zweiten Codeblock, der liest alle Nummern nach MIR_ bis zu 3 stellen aus und setzt den Wert für i automatisch. Wenn du vier stellen hast dann musst du bei Name.Substring(4,4) machen, wenn du 3 und 4 stellen gemischt hast, musst du den string per split() oder lenght() auslesen und splitten.

                      Und i wäre in deinem Fall einfach $i=1, da du ja bei 1 anfängst und nicht 0001.

                      /edit: Jetzt verstehe ich die Problematik ... die Zahl hinter MIR_ ist vierstellig? Dann musst du wie gesagt folgendes machen:

                      $obj=(get-childitem -Path $path).Name.Substring(4,4) | Sort-Object
                      [int]$int=$obj[0]
                      $result = $obj |% {$i = $int}{while ($i -lt $_){$i;$i++};$i++}
                      Write-Output "Missing Numbers: $result"

                      Beispiel:



                      Kommentar


                        #12
                        Richtig, die Zahl hinter mir_ ist immer vierstellig. Ob 0001 oder 3450, es ist immer vierstellig.

                        Powershell spuckt mir jetzt 2 Fehler aus.

                        Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen (Zeile 1; Zeichen 75)

                        Und:

                        In einem NULL-Arrax kann kein Index erstellt werden. (Zeile 2 Zeichen 16)

                        Kann hier wie gesagt nur auf die 1.0 Powershell zurückgreifen

                        Kommentar


                          #13
                          Ach so, Powershell 1 habe ich nicht gelesen.

                          Dann sollte das funktionieren:

                          $hash = @()
                          $obj=get-childitem -Path $path | foreach {$_.name}
                          foreach ($objs in $obj) {
                          $fields = $objs.Split("_")
                          $tmp=$fields[1]
                          $tmp2=$tmp.split(".")
                          $currentnmbr=$tmp2[0]
                          $hash += $currentnmbr
                          }
                          $result = $hash |% {$i = 0001}{while ($i -lt $_){$i;$i++};$i++}
                          Write-Host "Missing Numbers: $result"

                          ich bin mir nicht sicher ob hash tables in powershell 1 schon supported werden, aber ich glaube schon. Habe hier leider keine Option PS1 zu testen.

                          Kommentar


                            #14
                            Geil, funktioniert. Danke dir!!

                            Kommentar


                              #15
                              Rechnung kommt, vielen Dank für die Benutzung von MCS :)

                              Kommentar

                              Lädt...
                              X