Suchergebnisse mit Pfad kopieren?
Moderators: Hacker, Stefan2, white
Suchergebnisse mit Pfad kopieren?
Hallo!
Gibt es eine Möglichkeit, alle Ergebnisse einer Suche (Alt+F7, "anwenden") in das andere Fenster zu kopieren und dabei die Pfade mit zu kopieren?
Hintergrund: Daten sind nach Jahren und Monaten in entsprechenden Ordnern und auch auf CDs abgespeichert, heißen aber eben alle meinetwegen "Umsatz.odt". Beim Kopieren würden die Dateien überschrieben (oder nichtssagend mit (2)etc. gekennzeichnet). Statt der (2) der Ordnername angehängt wäre auch ein Lösung.
Ich weiß, daß so etwas über "Verzeichnisse synchronisieren" geht. Da muß ich aber noch einmal die Suche laufen lassen.
Oder kann man die Ergebnisliste einer Suche direkt in den Synchronisieren- Dialog übernehmen?
Für Hilfe wäre ich dankbar.
Mit freundlichen Grüßen
Geigolino
Gibt es eine Möglichkeit, alle Ergebnisse einer Suche (Alt+F7, "anwenden") in das andere Fenster zu kopieren und dabei die Pfade mit zu kopieren?
Hintergrund: Daten sind nach Jahren und Monaten in entsprechenden Ordnern und auch auf CDs abgespeichert, heißen aber eben alle meinetwegen "Umsatz.odt". Beim Kopieren würden die Dateien überschrieben (oder nichtssagend mit (2)etc. gekennzeichnet). Statt der (2) der Ordnername angehängt wäre auch ein Lösung.
Ich weiß, daß so etwas über "Verzeichnisse synchronisieren" geht. Da muß ich aber noch einmal die Suche laufen lassen.
Oder kann man die Ergebnisliste einer Suche direkt in den Synchronisieren- Dialog übernehmen?
Für Hilfe wäre ich dankbar.
Mit freundlichen Grüßen
Geigolino
Das geht AFAIK nur via Plugin, entweder TreeCopyPlus oder CopyTree. TC kann zwar relative Pfade beibehalten beim Kopieren, allerdings geht das derzeit ausschließlich in der Zweigansicht (Strg+B). Installiere eines der beiden genannten Plugins und anschließend kannst du die Dateien "packen" - es sind Packerplugins, die aber keine Packfunktion haben sondern die Struktur einfach ans Ziel kopieren.
Grüße
Dalai
Grüße
Dalai
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64
Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64
Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
Hallo Dalai,
das ging ja fix. Leider noch nicht mein Ziel:
Ich möchte nicht (nur) die Pfade kopieren, sondern die Dateien in entsprechende (anzulegende) Ordner.
Du schreibst aus der Zweigansicht geht das, das kann ich aber nicht nachvollziehen. Bei mir werden auch aus der Zweigansicht nur die Dateien kopiert.
Gruß
Geigolino
das ging ja fix. Leider noch nicht mein Ziel:
Ich möchte nicht (nur) die Pfade kopieren, sondern die Dateien in entsprechende (anzulegende) Ordner.
Du schreibst aus der Zweigansicht geht das, das kann ich aber nicht nachvollziehen. Bei mir werden auch aus der Zweigansicht nur die Dateien kopiert.
Gruß
Geigolino
VBScript: ForEachSelFileDo - Copy to Target with Path
Kleiner Nachteil der Plugins: 'etwas' umständlich, wenn man's häufiger brauch: Alt+F5 drücken, Plugin auswählen, Plugin einstellen.
Ein direkterer Weg zum Kopieren (Verschieben) von Source zu Target inklusive der Verzeichnisstruktur kann über ein Skript erreicht werden.
ZB mit solch einem VBScript.
- Skript als xx.vbs speichern
- Skript einmal anpassen (vsNewTargetPath, gleich übernommene Pfadbestandteile)
- Button anlegen (oder usercmd mit Tastaturkürzel)
- als Parameter "%L" und "%T" angeben
- Dateien auswählen, oder Suchen und Anwenden
- Button anklicken (oder Tastaturkürzel drücke)
Vorteil der Plugins: Einstellung 'on the fly'
Ein direkterer Weg zum Kopieren (Verschieben) von Source zu Target inklusive der Verzeichnisstruktur kann über ein Skript erreicht werden.
ZB mit solch einem VBScript.
- Skript als xx.vbs speichern
- Skript einmal anpassen (vsNewTargetPath, gleich übernommene Pfadbestandteile)
- Button anlegen (oder usercmd mit Tastaturkürzel)
- als Parameter "%L" und "%T" angeben
- Dateien auswählen, oder Suchen und Anwenden
- Button anklicken (oder Tastaturkürzel drücke)
Vorteil der Plugins: Einstellung 'on the fly'
Code: Select all
REM Total Commander VBScript "ForEachSelFileDo - Copy to Target with Path -WIP.vbs" by Stefan, 2017-04-09, v0.01
REM
REM Purpose: select files in one panel, execute this script to copy to target panel including origin paths
REM Like Plugins does, like CopyTree (http://totalcmd.net/plugring/CopyTree.html) or TreeCopyPlus (https://totalcmd.net/plugring/TreeCopyPlus.html)
REM Use from a Total Commander Button:
REM Command: "%Commander_Path%\TOOLs\ForEachSelFileDo - Copy to Target with Path.vbs"
REM Parameter: "%L" "%T"
REM (In Button-Dialog press F1-key and read TC help for more)
REM [x]Run minimized
REM
REM -----------------------------------------------------
REM -----------------------------------------------------
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSO = CreateObject("WScript.Shell")
vsTCtempList = Wscript.arguments.Item(0) ' The TC temp file due to the "%L" parameter
vsTCTargetPath = Wscript.arguments.Item(1) ' The Target panel due to the "%T" parameter
'//IB = InputBox(prompt[, title][, default] ,Xpos,Ypos,HelpFile location, Context in the help file)
REM vsNamensZusatz = InputBox("prompt", "title", "_default")
REM If (vsNamensZusatz = "") Then WScript.Quit
viFileCount = 0
If FSO.FileExists(vsTCtempList) Then
Set oTextStream = FSO.OpenTextFile(vsTCtempList,1)
Do Until oTextStream.AtEndOfStream
viFileCount = viFileCount + 1
vsFullName = oTextStream.ReadLine
If(Right(vsFullName,1)= "\") Then
Set oItem = FSO.GetFolder(vsFullName)
Else
Set oItem = FSO.GetFile(vsFullName)
End If
'//------------------------------------------------
vsName = FSO.GetFileName(oItem)
vsBase = FSO.GetBaseName(oItem)
vsExte = FSO.GetExtensionName(oItem)
vsPath = Replace(oItem.ParentFolder,":","")
'//------------------------------------------------
vaPathArray = split(vsPath, "\")
vsParent = vaPathArray( UBound(vaPathArray) )
vsGrandP1 = vaPathArray( UBound(vaPathArray) -1)
vsGrandP2 = vaPathArray( UBound(vaPathArray) -2)
vsGrandP3 = vaPathArray( UBound(vaPathArray) -3)
vsDrive = Replace(FSO.GetDriveName(oItem),":","")
vsTopFld = vaPathArray( 1)
vsTopFld2 = vaPathArray( 2)
'//------------------------------------------------
'// New Target Path: how many folders to keep from source?
vsNewTargetPath = vsTCTargetPath & vsPath
'vsNewTargetPath = vsTCTargetPath & Mid(vsPath,2) '//start at pos 2, drop drive part
'vsNewTargetPath = vsTCTargetPath & vsDrive & "\" & vsParent
'vsNewTargetPath = vsTCTargetPath & vsParent
'vsNewTargetPath = vsTCTargetPath & vsDrive & "\" & vsTopFld
'vsNewTargetPath = vsTCTargetPath & vsDrive & "\" & vsTopFld & "\" & vsTopFld2
'vsNewTargetPath = vsTCTargetPath & vsGrandP2 & "\" & vsGrandP1 & "\" & vsParent
If NOT FSO.FolderExists(vsNewTargetPath) Then CreatePath(vsNewTargetPath)
'//------------------------------------------------
'// New Target Path + Name:
vsTargetName = vsNewTargetPath & "\" & vsBase & vsNamensZusatz & "." & vsExte
'// New Target Path + Name, mark already existent duplicates:
viTargetNameCount = 2
Do While(FSO.FileExists(vsTargetName))
vsTargetName = vsNewTargetPath & "\" & vsBase & vsNamensZusatz & "_(" & viTargetNameCount & ")." & vsExte
viTargetNameCount = viTargetNameCount + 1
Loop
'msgbox vsFullName & vbLF & vsTargetName
'//------------------------------------------------
'// Do the work, copy files to target:
'//FSO.CopyFile source, destination[, overwrite]
'//FSO.MoveFile source, destination
FSO.CopyFile vsFullName, vsTargetName, False 'False/True=überschreiben
Loop
oTextStream.Close
Else
MsgBox "Input file list vsTCtempList not found. Check TCs button parameter!"
End If
MsgBox "All "&viFileCount&" done!"
Function CreatePath(strPath)
On Error Resume Next
strParentPath = FSO.GetParentFolderName(strPath)
If Not FSO.FolderExists(strParentPath) Then CreatePath strParentPath
If Not FSO.FolderExists(strPath) Then FSO.CreateFolder strPath
CreatePath = FSO.FolderExists(strPath)
End Function
Script- File läuft nicht
Hallo Stefan,
vielen Dank, das mit dem Skript klingt ja prima! Allerdings bekomme ich eine Fehlermeldung:
Fehler: ActiveX-Komponenten kann kein Objekt erstellen: "WScript.Shell"
Code: 800A01AD
Quelle: Laufzeitfehler in Microsoft VBScript
Muß ich in den TC- Einstellungen Skripte ermöglichen, oder was ist da falsch? Bei mir läuft noch der 8.01, kann es daran liegen?
Gruß
Udo
vielen Dank, das mit dem Skript klingt ja prima! Allerdings bekomme ich eine Fehlermeldung:
Fehler: ActiveX-Komponenten kann kein Objekt erstellen: "WScript.Shell"
Code: 800A01AD
Quelle: Laufzeitfehler in Microsoft VBScript
Muß ich in den TC- Einstellungen Skripte ermöglichen, oder was ist da falsch? Bei mir läuft noch der 8.01, kann es daran liegen?
Gruß
Udo
Hallo Udo,
das Skript funktioniert mit allen TC Versionen.
Wie/Wo führst du das Skript denn aus?
Welche Windows Version?
Funktionieren VBScripts überhaupt auf deinem System?
- - -
Kommentiere die beiden Zeilen mal mit "REM " aus
vsTCtempList = Wscript.arguments.Item(0)
vsTCTargetPath = Wscript.arguments.Item(1)
REM vsTCtempList = Wscript.arguments.Item(0)
REM vsTCTargetPath = Wscript.arguments.Item(1)
Füge stattdessen die folgende Zeile ein:
MsgBox "Hallo Udo"
Führe das Skript erneut aus,.... was passiert?
- - -
Ich schau' morgen wieder rein.
- - -
Ach so,... hast du den Button genau so angelegt?
REM Use from a Total Commander Button:
Command = "%Commander_Path%\TOOLs\ForEachSelFileDo - Copy to Target with Path.vbs"
Parameter = "%L" "%T"
Zeig' mal her (rechte Maustaste auf den Button, > Kopieren, > hier einfügen.
---
Falls du hierbei Anfänger bist:
"%Commander_Path%" verweist auf den Ordner des laufenden TCs,
"TOOLs" ist ein selbst angelegter Unterordner für eigene hinzugefügte Tools und Skripte.
das Skript funktioniert mit allen TC Versionen.
Wie/Wo führst du das Skript denn aus?
Welche Windows Version?
Funktionieren VBScripts überhaupt auf deinem System?
- - -
Kommentiere die beiden Zeilen mal mit "REM " aus
vsTCtempList = Wscript.arguments.Item(0)
vsTCTargetPath = Wscript.arguments.Item(1)
REM vsTCtempList = Wscript.arguments.Item(0)
REM vsTCTargetPath = Wscript.arguments.Item(1)
Füge stattdessen die folgende Zeile ein:
MsgBox "Hallo Udo"
Führe das Skript erneut aus,.... was passiert?
- - -
Ich schau' morgen wieder rein.
- - -
Ach so,... hast du den Button genau so angelegt?
REM Use from a Total Commander Button:
Command = "%Commander_Path%\TOOLs\ForEachSelFileDo - Copy to Target with Path.vbs"
Parameter = "%L" "%T"
Zeig' mal her (rechte Maustaste auf den Button, > Kopieren, > hier einfügen.
---
Falls du hierbei Anfänger bist:
"%Commander_Path%" verweist auf den Ordner des laufenden TCs,
"TOOLs" ist ein selbst angelegter Unterordner für eigene hinzugefügte Tools und Skripte.
Bin ratlos
Hallo Stefan,
mit (Excel und Access) VBA hatte ich schon öfters zu tun.
Hier die "Kopie" des Button:
TOTALCMD#BAR#DATA
%Commander_Path%\TOOLs\ForEachSelFileDo__Copy_to_Target_with_Path.vbs
%L %T
C:\totalcmd\TOTALCMD.EXE,32
-1
Das Script wird ja auch aufgerufen und läuft bis zu der Zeile
Set WSO = CreateObject("WScript.Shell")
Ich habe auch schon mal versuch WSO zu deklarieren, nix. Immer wieder die im letzten Beitrag geschriebenen Meldung:
ActiveX-Komponenten kann kein Objekt erstellen: "WScript.Shell"
Zu Deinen Fragen:
Excel VBA läuft problemlos, als System hab ich noch XP.
Und ja, mich grüßt das Script auch ganz brav mit "Hallo Udo", läuft dann weiter bis es FSO nicht findet.
Bin ratlos...
Gruß
Udo
mit (Excel und Access) VBA hatte ich schon öfters zu tun.
Hier die "Kopie" des Button:
TOTALCMD#BAR#DATA
%Commander_Path%\TOOLs\ForEachSelFileDo__Copy_to_Target_with_Path.vbs
%L %T
C:\totalcmd\TOTALCMD.EXE,32
-1
Das Script wird ja auch aufgerufen und läuft bis zu der Zeile
Set WSO = CreateObject("WScript.Shell")
Ich habe auch schon mal versuch WSO zu deklarieren, nix. Immer wieder die im letzten Beitrag geschriebenen Meldung:
ActiveX-Komponenten kann kein Objekt erstellen: "WScript.Shell"
Zu Deinen Fragen:
Excel VBA läuft problemlos, als System hab ich noch XP.
Und ja, mich grüßt das Script auch ganz brav mit "Hallo Udo", läuft dann weiter bis es FSO nicht findet.
Bin ratlos...
Gruß
Udo
>Hier die "Kopie" des Button:
>%Commander_Path%\TOOLs\ForEachSelFileDo__Copy_to_Target_with_Path.vbs
>%L %T
Bitte immer korrekt "Quoten"
"%Commander_Path%\TOOLs\ForEachSelFileDo__Copy_to_Target_with_Path.vbs"
"%L" "%T"
(Außer der Kombination %P%N, die Quoted der TC bei Bedarf selbst)
---
>Das Script wird ja auch aufgerufen und läuft bis zu der Zeile Set WSO
Da wir dieses hier gar nicht benötigen (Überbleibsel aus Vorlage)
kannst du das mal auskommentieren oder raus löschen.
---
>brav mit "Hallo Udo", läuft dann weiter bis es FSO nicht findet.
Wieso jetzt auch "FSO" ?
Das ist etwas anderes als "WScript".
Welche Zeile wird den in der Fehlermeldung bemängelt?
Du kannst die komplette Meldung mit Strg+C kopieren und hier rein kopieren.
---
Ein Versuch:
Ändere mal
Set FSO = CreateObject("Scripting.FileSystemObject")
zu
Set FSO = Wscript.CreateObject("Scripting.FileSystemObject")
---
>%Commander_Path%\TOOLs\ForEachSelFileDo__Copy_to_Target_with_Path.vbs
>%L %T
Bitte immer korrekt "Quoten"
"%Commander_Path%\TOOLs\ForEachSelFileDo__Copy_to_Target_with_Path.vbs"
"%L" "%T"
(Außer der Kombination %P%N, die Quoted der TC bei Bedarf selbst)
---
>Das Script wird ja auch aufgerufen und läuft bis zu der Zeile Set WSO
Da wir dieses hier gar nicht benötigen (Überbleibsel aus Vorlage)
kannst du das mal auskommentieren oder raus löschen.
---
>brav mit "Hallo Udo", läuft dann weiter bis es FSO nicht findet.
Wieso jetzt auch "FSO" ?
Das ist etwas anderes als "WScript".
Welche Zeile wird den in der Fehlermeldung bemängelt?
Du kannst die komplette Meldung mit Strg+C kopieren und hier rein kopieren.
---
Ein Versuch:
Ändere mal
Set FSO = CreateObject("Scripting.FileSystemObject")
zu
Set FSO = Wscript.CreateObject("Scripting.FileSystemObject")
---
Hallo Stefan,
die Zeile "Set WSO = CreateObject("WScript.Shell") "
war der Übeltäter. Auskommentiert, und nun läuft das Script wie gewünscht, Klasse.
Ganz herzlichen Dank für die Hilfe!
Darf ich Dich OT noch was (bestimmt dummes) fragen: Aus Excel kenne ich, daß immer Sub- Routinen verwendet werden. Wieso kann man das hier weglassen?
Gruß Udo
die Zeile "Set WSO = CreateObject("WScript.Shell") "
war der Übeltäter. Auskommentiert, und nun läuft das Script wie gewünscht, Klasse.
Ganz herzlichen Dank für die Hilfe!
Darf ich Dich OT noch was (bestimmt dummes) fragen: Aus Excel kenne ich, daß immer Sub- Routinen verwendet werden. Wieso kann man das hier weglassen?
Gruß Udo
Ich weiß nicht, ob man bei VBA zwingend Sub-Routinen benötigt,
oder ob "Excel" das einfach so als Host vorgibt, um da etwas Ordnung zu schaffen.
Excel an sich läuft ja bereits die ganze Zeit.
Irgendwann will du einen Code ausführen,
dazu muss das VBA wissen, welchen Teil des Codes
du jetzt ausführen willst >>> Sub .
Das Modul als solches kann man ja nicht komplett als
Befehl zum Ausführen angeben (oder?)
Bei einem VBS-Skript ruft du explizit die VBS-Datei als Code auf.
Und falls da keine Sub-Routinen wie Sub oder Function()
vorhanden sind, läuft da halt das komplette Skript durch.
Aber zum debuggen stecke ich den Code auch in eine Prozedur und rufe diese explizit auf.
doit
Sub doit
...
End Sub 'doit
VBS und JS wurden eben so entwickelt.
Bei 'C' muss man zB auch immer eine main() Sub-Routine haben.
Manche Dinge sind eben wie sie sind, dass muss ich auch oft einfach so hinnehmen.
Vieles wird einem auch von allzu smarten Anwendung einfach als Gegeben vorgesetzt.
HTH?
oder ob "Excel" das einfach so als Host vorgibt, um da etwas Ordnung zu schaffen.
Excel an sich läuft ja bereits die ganze Zeit.
Irgendwann will du einen Code ausführen,
dazu muss das VBA wissen, welchen Teil des Codes
du jetzt ausführen willst >>> Sub .
Das Modul als solches kann man ja nicht komplett als
Befehl zum Ausführen angeben (oder?)
Bei einem VBS-Skript ruft du explizit die VBS-Datei als Code auf.
Und falls da keine Sub-Routinen wie Sub oder Function()
vorhanden sind, läuft da halt das komplette Skript durch.
Aber zum debuggen stecke ich den Code auch in eine Prozedur und rufe diese explizit auf.
doit
Sub doit
...
End Sub 'doit
VBS und JS wurden eben so entwickelt.
Bei 'C' muss man zB auch immer eine main() Sub-Routine haben.
Manche Dinge sind eben wie sie sind, dass muss ich auch oft einfach so hinnehmen.
Vieles wird einem auch von allzu smarten Anwendung einfach als Gegeben vorgesetzt.
HTH?

Ja Danke, das hat schon geholfen.
Und jetzt wirklich als allllerletzte Frage: Gibt es eine Befehlsreferenz für VB in Beziehung zu TC? Ich meine aber nicht die allgemeinen Strukturen wie Schleifen etc., sondern die Anknüpfung an den Total Commander. Im Netz und auch in der Hilfe konnte ich nichts finden.
Beste Grüße
Udo
Und jetzt wirklich als allllerletzte Frage: Gibt es eine Befehlsreferenz für VB in Beziehung zu TC? Ich meine aber nicht die allgemeinen Strukturen wie Schleifen etc., sondern die Anknüpfung an den Total Commander. Im Netz und auch in der Hilfe konnte ich nichts finden.
Beste Grüße
Udo
TC Parameter (%L, %T):
> rechter Mausklick auf einen Button > Ändern... > F1-Taste > lesen
TC interne Befehle :
> cm_CommandBrowser in TC-Kommandozeile eintippen > Enter-Taste
> oder die TOTALCMD.inc zum lesen öffnen (F3-Taste)
Mit den TC-Parametern kann man externe Skripts mit Infos füttern und Vieles "von Außen" erledigen.
Die TC-Befehle kann man intern anwenden, oder aus externen Skripts mittels SendMessage aufrufen um TC etwas "fern zu bedienen".
Weiter Infos kann man mit diesen Stichwörtern im Forum finden (oder einfach nochmal nachfragen)
Mehr dazu zB auch hier
Generic how-to's / Allgemeine Fragen
TC9: "Send WM_USER+50 with wparam" - how-to?
> rechter Mausklick auf einen Button > Ändern... > F1-Taste > lesen
TC interne Befehle :
> cm_CommandBrowser in TC-Kommandozeile eintippen > Enter-Taste
> oder die TOTALCMD.inc zum lesen öffnen (F3-Taste)
Mit den TC-Parametern kann man externe Skripts mit Infos füttern und Vieles "von Außen" erledigen.
Die TC-Befehle kann man intern anwenden, oder aus externen Skripts mittels SendMessage aufrufen um TC etwas "fern zu bedienen".
Weiter Infos kann man mit diesen Stichwörtern im Forum finden (oder einfach nochmal nachfragen)
Mehr dazu zB auch hier
Generic how-to's / Allgemeine Fragen
TC9: "Send WM_USER+50 with wparam" - how-to?