helmuthelmut2000
Goto Top

Dateiname ändern, und auch in Datei ändern. evt mit einem Batch

Hallo,

Ich möchte folgendes umsetzten:

Ich habe ein paar Ordner mit Dateien
Die Dateien haben folgende Dateinamen,

ABC123456.doc
ABC123457.doc
ABC123458.doc
usw.

jetzt steht in dem Text der Datei (und auch in anderen Dateien) auch die
ABC123456.doc
ABC123457.doc
ABC123458.doc
usw

Jetzt mein Problem,
Wie muss so eine Batch Datei aussehen die aus dem
ABC123456.doc ABC123457.doc ABC123458.doc usw
das ABC entfernt, und auch in den Dateien muss das ABC1234.......doc geändert werden in nur

123456.doc
123457.doc
123458.doc
usw.

Geht das überhaupt mit einer Batch Datei.
Muss da der Dateinamen in eine Variable geschrieben werden und dann verändert werden dann mit suchen und ersetzen.....

Gruß
Helmut

Content-Key: 298310

Url: https://administrator.de/contentid/298310

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: rubberman
rubberman 05.03.2016 um 17:41:31 Uhr
Goto Top
Ja geht, aber die Regeln musst du schon noch definieren!

  • Sind es immer Buchstaben und Ziffern in variabler Anzahl, wobei die Buchstaben entfernt werden sollen? Oder ...
  • Soll der Dateiname immer auf die letzten 6 Stellen eingekürzt werden? Oder ...

... eine andere Regel?
Keine Ahnung.

Grüße
rubberman
Mitglied: 126919
126919 05.03.2016 aktualisiert um 19:03:03 Uhr
Goto Top
Hallo,
das Umbenennen ist kein Problem, aber für das Ersetzen innerhalb der Dateien ist schon mehr erforderlich. Das müsstest du für jedes Dateiformat skripten. Bei Office-Dokumenten ist das kein Problem da diese über die COM-Schnittstelle per Skript ansteuerbar sind.
Batch ist dafür aber völlig ungeeignet, mindestens VBS solltest du dafür verwenden.

Mit Powershell würde sowas dann für Word Dokumente und die Umbenennung nach deiner Beschreibung etwa so aussehen:
# Word COM-Object erzeugen
$objWord = New-Object -Com Word.Application
# Zum Testen Word anzeigen
$objWord.Visible = $true
# null parameter für nicht benötigte Parameter in Word-Funktionen
$n = [System.Reflection.Missing]::Value

# Für jede *.doc Datei in einem Ordner:
gci 'C:\OrdnerXYZ\*.doc' -File | %{  
    # Datei öffnen
    $doc = $objWord.Documents.Open($_.Fullname)
    # Nach Dateinamen suchen und entsprechend ersetzen
    $doc.Content.Find.Execute('<[A-Za-z]@([0-9]@.doc)>', $true, $false, $true, $false, $false, $true, 1, $false, '\1', 2, $n, $n, $n, $n)  
    # Dokument speichern und schließen
    $doc.Save()
    $doc.Close()
    # aktuelle Datei umbenennen
    rename-item $_.FullName -NewName ($_.Name -replace '([A-Z]+)(\d+\.doc)$','$2')  
}
# Word schließen
$objWord.Quit()
# Com-Objekt freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($objWord)
Wie gesagt, für Office-Dokumente wie Word, Excel, Powerpoint lässt sich die Ersetzung im Dokument skripten, wie das für deine anderen Dateien aussieht können wir hier nicht wissen da wir sie nicht kennen. Hier sind dann immer Anpassungen an die jeweilige Anwendung obligatorisch.

fk
Mitglied: rubberman
rubberman 05.03.2016 aktualisiert um 20:09:16 Uhr
Goto Top
innerhalb der Dateien
Oh, hab ich irgendwie missverstanden. Innerhalb von Word Dateien, definitiv nicht mit Batch, richtig.
Die Frage, nach welchen Regeln die Dateinamen verändert werden sollen, stellt sich mir aber auch weiterhin.

Grüße
rubberman
Mitglied: helmuthelmut2000
helmuthelmut2000 05.03.2016 um 20:39:52 Uhr
Goto Top
Hallo rubberman,

Die Buchstaben sind immer gleich.

ABC steht immer.
Dann gibt es auch noch einige mit ABD.
Da gibt es nicht so viel verschiedene.
Die Ziffern sind fortlaufend. Geht bei
ABC1000 los und ist bei ca. ABC84000 da fehlen aber auch
dazwischen ein paar tausend.
Das umbenennen der Dateien ist kein Problem.
Das Problem habe ich bei dem ändern in den Dateien.

Gruß
Mitglied: helmuthelmut2000
helmuthelmut2000 05.03.2016 um 20:45:19 Uhr
Goto Top
Hallo fk,

Das sind bei mir nicht nur Word Dokumente, sondern da sind auch
nur .txt Dateien dabei.
Diese kann man mit Notepad++ öffnen und bearbeiten.
Ich kann die Dateien auch mit Notepad++ suchen und ersetzen.
Da muss ich aber jeden Dateinamen manuell eingeben.
Bei so viel Daten sollte das Automatisch gelesen und ausgeführt werden.

Gruß
Helmut
Mitglied: helmuthelmut2000
helmuthelmut2000 05.03.2016 um 21:00:33 Uhr
Goto Top
Die Regel ist so,

Das immer die Dateien umbenannt werden sollen, Das die
Buchstaben wegfallen, damit immer nur noch die Ziffern bleiben. ( Das ist dann besser für den Anwender zum eintippen
mit dem Nummernblock).

Der Dateiname ist nicht das Problem, das ABC wegmachen geht mit einem Batch renamer.
Aber der Dateiname ist auch noch in den Dateien drin und werden dann nicht mehr gefunden,
weil der Dateiname dann umbenannt ist.
Ich habe das schon mit suchen und ersetzten versucht, das geht auch, aber da muss ich
ja jeden Dateinamen eingeben und bei ein paar Tausend ist das unmöglich.

Gruß
Helmut
Mitglied: rubberman
rubberman 05.03.2016 um 21:26:14 Uhr
Goto Top
Das sind bei mir nicht nur Word Dokumente, sondern da sind auch nur .txt Dateien dabei.
Dateien, die nur Plaintext enthalten, lassen sich relativ einfach mit den puren Möglichkeiten von Scriptsprachen bearbeiten. Bei allen anderen Dateitypen muss man mit den Programmen arbeiten, die diese bearbeiten können, und diese müssen dann obendrein ein Interface zur Verfügung stellen, um per Script bedienbar zu sein.
Um welche Dateitypen geht es denn nun im einzelnen?

Grüße
rubberman
Mitglied: helmuthelmut2000
helmuthelmut2000 05.03.2016 um 21:40:48 Uhr
Goto Top
Hallo rubberman,

Das sind .txt und .log und .html und .doc
Die Dateien die umbenannt werden sollen sind .doc und auch .pdf.

Die pdf sind schon erzeugt und die darin enthaltene Dateien brauchen nicht geändert werden,
aber der Dateinamen der .pdf sollte ohne ABC sein.

Gruß
Helmut
Mitglied: helmuthelmut2000
helmuthelmut2000 05.03.2016 um 21:46:25 Uhr
Goto Top
Hallo rubberman,

Da war am Anfang ein Fehler von mir.
Die Dateien die die Basis sind, sind immer .txt Dateien.

ABC123456.txt
usw

Gruß
Mitglied: helmuthelmut2000
helmuthelmut2000 06.03.2016 um 00:40:48 Uhr
Goto Top
Hallo Flachkoepper,

Das ist doch ausbaufähig.
Kannst du mir das auch mal so machen das es nicht mit Word sondern mit Notepad++ bearbeitet wird.

Ich hab das am Anfang nicht Richtig geschrieben.
Das sind .txt Dateien und die kann ich mit Notepad++ bearbeiten.

Danke.

Gruß
Helmut
Mitglied: 126919
126919 06.03.2016 aktualisiert um 10:13:10 Uhr
Goto Top
Na wenns nur reine Textdateien sind, das geht ja out of the box ohne die zugeordnete Anwendung.

In allen Textdateien das die Bauchstaben der Dateinamen entfernen und nur die Zahlen + Dateiendung (doc) drin stehen lassen.
gci 'c:\ordner\*.txt' | %{(gc $_.Fullname) -replace '[A-Z]+(\d+\.doc)','$1' | out-file $_.Fullname}  

Leider wird deine Beschreibung durch die nun in diversen deiner Antworten wiedersprüchlichen Angaben nicht besser. Also versuche dich mal mit einem einzigen Posting in dem alles klipp und klar und unmissverständlich drin steht, denn so weis doch kaum einer mehr was deine exakten Anforderungen sind face-sad
Mal sind es doc mal wieder nur txt dann doch PDF ....??!
Hätte man seinen Ursprungspost gleich zu Beginn mit allen benötigten Infos gefüllt wäre das in ein zwei Postings alles geklärt gewesen, ohne einem alles aus der Nase ziehen zu müssen!!
Mitglied: helmuthelmut2000
helmuthelmut2000 06.03.2016 um 12:19:04 Uhr
Goto Top
Hallo Flachkoeppler,

Ja du hast recht, ich hab mich da am Anfang etwas verhaut.
Ich hatte auch da noch nicht Richtig gewusst wo die Dateien überall stecken.
Aber jetzt weis ich es.

Einen Ordner gibt es mit Unterordner,
In den Unterordnern sind .txt Dateien und .log und .pdf und .doc
ABC123456.txt und
ABC123456.log
ABC123456.pdf
ABC123456.doc

Das ABC gibt es, und es gibt auch ABD.
Die Ziffern 123456 sind fortlaufend das geht von 1000 bis 84000.
Damit sich der Anwender beim Tippen etwas leichter tut möchte ich das ABC und ABD wegmachen.
Es reicht wenn er dann im Nummernblock nur die Ziffer tippt.

An den Dateien das ABC und ABD zu entfernen ist nicht das schwierige, sondern der Dateiname steckt ja in den
Dateien als link oder Text drin.
Da muss natürlich in der Datei der Inhalt auch korrigiert werden.
Das .pdf braucht der Inhalt nachträglich nicht korrigiert werden aber der Dateiname sollte auch ohne dem ABC oder ABD sein.
Wenn das .doc schwierig ist den Inhalt zu ändern dann kann der auch unverändert bleiben. Aber wichtig ist das in dem
.txt und im .log der Inhalt von zB ABC123456.pdf in 123456.pdf geändert wird.

Frag mich einfach, wenn noch etwas fehlt, ich weis ich bin ein sehr schlechter Beschreiber.

Gruß
Helmut
Mitglied: 126919
126919 06.03.2016 aktualisiert um 17:31:04 Uhr
Goto Top
#Ordner in dem die Dateien verarbeitet werden
$folder = 'c:\ordnerxyz'  
# Word Objekt erzeugen
$objWord = New-Object -Com Word.Application
# null parameter für word-funktionsaufrufe
$n = [System.Reflection.Missing]::Value
# Durchsuche den o.a. Ordner rekursiv nach den Dateien
gci "$folder\*" -Include '*.log','*.txt','*.doc' -Recurse | %{  
   # wenn es ein Word-Dokument ist ...
   if ($_.Extension -eq '.doc'){  
    # öffne es
    $doc = $objWord.Documents.Open($_.Fullname)
    # ersetze alle Dateinamen nach dem gewünschten Muster
    $doc.Content.Find.Execute('<[A-Za-z]@([0-9]@.doc)>', $false, $false, $true, $false, $false, $true, 1, $false, '\1', 2, $n, $n, $n, $n)  
    # speichere das Dokument und schließe es 
    $doc.Save();  $doc.Close()
   }Else{
       # Wir verarbeiten eine Paintext-Datei
       (gc $_.Fullname) -replace '[A-Z]+(\d+\.(doc|txt|log|pdf))','$1' | out-file $_.Fullname  
   }
}
# Word schließen
$objWord.Quit()
# COM-Objekt freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($objWord)
Mitglied: helmuthelmut2000
helmuthelmut2000 06.03.2016 um 16:58:19 Uhr
Goto Top
Hallo Flachkoepper,

Danke das funktioniert super.
Könntest du mir das bitte etwas erklären.
Mich interessiert das und ich möchte daraus auch lernen.

was macht die Zeile Nr. 08 und die Zeile 11genau?

Danke.
Mitglied: helmuthelmut2000
helmuthelmut2000 06.03.2016 um 16:59:40 Uhr
Goto Top
Noch etwas.

Ist es auch möglich da ein Protokoll mit einzubinden,
wo geschrieben wird in welcher Datei was geändert wird?

Gruß
Mitglied: 126919
Lösung 126919 06.03.2016 aktualisiert um 17:58:09 Uhr
Goto Top
Zitat von @helmuthelmut2000:
was macht die Zeile Nr. 08 und die Zeile 11genau?
Diese Zeile
$doc.Content.Find.Execute('<[A-Za-z]@([0-9]@.doc)>', $false, $false, $true, $false, $false, $true, 1, $false, '\1', 2, $n, $n, $n, $n)
macht nichts anderes als mit einem Muster nach Strings zu suchen die deinen Dateinamen entsprechen, also mindestens ein Buchstabe von A-Z oder a-z gefolgt von mindestens einer Zahl von 0-9 und anschließendem .doc. Die < und > bedeuten Wortanfang und Wortende.
Die Klammern () setzen eine Backreference die wir im Ersetzungsstring mit \1 benutzen um nur diesen Teil des Musters zu erhalten, also alles bis auf die Buchstaben am Anfang.
Das ist das selbe wenn du im Dokument auf F5 drückst und dieses Muster in den Ersetzen Dialog eingibst.
Was die weiteren Parameter der Funktion bedeuten kannst du hier nachlesen:
https://msdn.microsoft.com/de-de/library/office/ff193977.aspx

Dann zu dieser Zeile:
(gc $_.Fullname) -replace '[A-Z]+(\d+\.(doc|txt|log|pdf))','$1' | out-file $_.Fullname
Diese holt sich den gesamten Inhalt der Textdatei (gc $_.Fullname) dann wird mit dem Operator -replace und dem Regular-Expression-String das selbe gemacht wie oben im Word-Dokument. Nur ist hier die Syntax etwas anders da es sich hier um einen regulären Regular-Expression-String handelt. Word verwendet hier eine andere proprietäre Muster-Syntax. Hier wird die Backreference also das Klammernpaar als $1 angesprochen. Das ganze wird dann per Pipe an out-file gesendet welches es in die Datei zurückschreibt.

Hoffe das hilft dir das zu verstehen.

Regular-Expressions kann ich dir hier nicht bis ins Detail erläutern, das würde zu weit gehen, denn das ist ein riesiges Thema mit dem du dich mal in Ruhe beschäftigen solltest.
Regular Expressions

Ist es auch möglich da ein Protokoll mit einzubinden,
Kann man machen, ist aber zusätzlicher Aufwand.

Gruß fk
Mitglied: helmuthelmut2000
helmuthelmut2000 06.03.2016 um 17:58:45 Uhr
Goto Top
Danke.

Das passt so.

Gruß
Mitglied: helmuthelmut2000
helmuthelmut2000 07.03.2016 um 23:08:39 Uhr
Goto Top
Hallo Flachkoepper,

Ich bin da noch auf zwei Ausnahmen gekommen.
Könntest du mir da bitte noch Helfen.

1.
Da steht in manchen log Dateien der Dateiname ohne das .txt, das hätte ich auch gerne umbenannt.
z.B.
ABC123456
in
123456

2.
Dann habe ich auch Dateien die sehen so aus:
ABC007_123456.txt
Das hätte ich auch gern sauber wie die anderen
123456.txt
Die habe ich so als Datei und die stehen auch in Dateien.

Gruß
Helmut