Dateien im Verzeichnisbaum mit bestimmtem Namen ersetzen

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
Alexander77
Junior Member
Junior Member
Posts: 24
Joined: 2009-07-05, 08:05 UTC

Dateien im Verzeichnisbaum mit bestimmtem Namen ersetzen

Post by *Alexander77 »

Ich möchte alle Dateien im einem Verzeichnisbaum, welche einen bestimmten Namen haben, durch eine vorgegebene Datei ersetzen. Hat jemand eine Idee, wie man das bewerkstelligen kann?

Alle Dateien mit einem bestimmten Namen zu finden, ist einfach. Auch könnte man sie einfach löschen. Aber kann man sie auf einfache Weise durch eine vorgegebene Datei ersetzen (überschreiben)?
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Mit einem Skript?

Etwa:
- Datei suchen > Feed to Listbox
- die Liste der Dateien in der Listbox mittels TC Parameter %L in eine temporäre Datei schreiben lassen
- ein Skript starten, welches durch diese Dateiliste geht
und in jedem Pfad die Datei durch die neue Datei austauscht.

Pseudo-Code:

vTempDatei = "X:\Test\NeueDatei.txt"
For Each File in TC-%L-List Do
- merke nur den Pfad zur Datei in VPATH
- Lösche alte Datei
- kopiere vTempDatei VPATH
Next
User avatar
Horst.Epp
Power Member
Power Member
Posts: 6984
Joined: 2003-02-06, 17:36 UTC
Location: Germany

Post by *Horst.Epp »

Da bietet sich Christians TC MakeBAT Plugin an.
http://www.ghisler.com/plugins.htm
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

MakeBAT Plugin?

Aber doch nicht aus der ListBox heraus?
Da bekomme ich nur eine Zeile in die Batch geschrieben.
Nur aus dem normalen ListView, oder BranchView heraus bekomme ich alle Dateien in die Liste.

Und dann gibt's bei Batch öfters Probleme mit Umlaute und Akzent Zeichen.



Von der "Search to List Box" aus würde ich es folgendermaßen machen:

(vorher ein Backup der wichtigen Dateien erstellen)


- TC button anlegen zum unten angegebenen Skript:
"%COMMANDER_PATH%\VBS\ForEachSelFileDo.vbs"
mit %L als Parameter

- Datei suchen
- Feed to list box
- alle markieren
- skript ausführen

- Hier das Beispiel Skript

Code: Select all

'On Error Resume Next
Set FSO  = CreateObject("Scripting.FileSystemObject")
Set WS   = Wscript.CreateObject("WScript.Shell")
Const FORREADING = 1
Const vNewFilePath = "D:\rive\path\to"
Const vNewFileName = "new file.ext"

sTCtempList = Wscript.arguments.Item(0) ' The TC temp file due the "%L" parameter
   If  FSO.FileExists(sTCtempList) Then
      '// DEBUG: 
      'MsgBox "Tempfile is: " & sTCtempList    '>> C:\Users\myusername\AppData\Local\Temp\CMDB034.tmp
      'WS.run "notepad " & sTCtempList
      
      Set      oTextStream = FSO.OpenTextFile(sTCtempList,FORREADING)
      Do Until oTextStream.AtEndOfStream
                '//Für jede Datei in der TC-Liste mache:
                
    			vFullName = oTextStream.ReadLine
    			Set oFile = FSO.GetFile(vFullName)
    				vName = FSO.GetFileName(oFile)
    				vBase = FSO.GetBaseName(oFile)
    				vExte = FSO.GetExtensionName(oFile)
    			    vPath     = oFile.ParentFolder

    			'//POSSIBLE ACTIONS:

                '//Debug:
    			rtn = MsgBox("FullName: " & vFullName & vbCRLF & vbCRLF _
    			           & "New File: " & vNewFilePath &"\"& vNewFileName , vbOkCancel,"Header line")
    			if(rtn = vbCancel) Then WScript.Quit
    			
    			'//In diesem Fall:
                
    			'instead of Deleting immediately, first rename origin file to a tmp name for secure reason:
                'FSO.MoveFile source, destination
    			FSO.MoveFile vFullName, vFullName & ".tmp." & vExte
    			
    			'copy new file on place of old file, only if not already 
                'exists due to searching with wild cards:
    			If Not (FSO.FileExists(vPath & "\" & vNewFileName)) Then 
    				'FSO.CopyFile source, destination[, overwrite]
    				FSO.CopyFile vNewFilePath &"\"& vNewFileName, vPath & "\"
    				
    				'delete the origin, now tmp, file:
    				'FSO.DeleteFile filespec[, force]
    				FSO.DeleteFile vFullName & ".tmp." & vExte
    			Else
    				MsgBox vPath & "\" & vNewFileName & " already exists, so we did not copy it again."
    			End If
      Loop
      oTextStream.Close
   Else
      WScript.Echo "Input file " & sTCtempList & " not found."
   End If


.
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

Warum so kompliziert?
- Zu ersetzende Dateien suchen <Alt+F7>
- Anwenden & Markieren
- Im anderen Panel die neue Datei markieren
- <F5> :: "Optionen>>" :: "[x] Kopiere in alle markierten Verzeichnisse/Verknüpfungen im Zielfenster"
- Falls die neue Datei einen anderen Namen hat als die alten Dateien im Zielfenster, diese anschließend löschen.

Gruss
Holger

PS: Das klappt natürlich nicht wenn die zu ersetzenden Dateien Verknüpfungen sind ;-)
User avatar
Horst.Epp
Power Member
Power Member
Posts: 6984
Joined: 2003-02-06, 17:36 UTC
Location: Germany

Post by *Horst.Epp »

Stefan2 wrote:MakeBAT Plugin?

Aber doch nicht aus der ListBox heraus?
Da bekomme ich nur eine Zeile in die Batch geschrieben.
Nur aus dem normalen ListView, oder BranchView heraus bekomme ich alle Dateien in die Liste.

Und dann gibt's bei Batch öfters Probleme mit Umlaute und Akzent Zeichen.
...
.
Ich bekomme da alle Einträge aus der Listbox, jeden in einer eigenen Zeile.
Keine Probleme so einen Job zu generieren.
Alexander77
Junior Member
Junior Member
Posts: 24
Joined: 2009-07-05, 08:05 UTC

Post by *Alexander77 »

Habe nicht erwartet, in so kurzer Zeit gleich vier Lösungsmöglichkeiten aufgezeigt zu bekommen :D .

Die Option "Kopiere in alle markierten Ordner/Verknüpfungen im Zielordner" ist natürlich genial (typisch TC!). Bisher ist mir diese Option gar nicht aufgefallen.

Vielen Dank euch allen für die tolle Unterstützung.
Post Reply