Suchergebnisse mit Pfad kopieren?

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
Geigolino
Junior Member
Junior Member
Posts: 55
Joined: 2005-10-24, 14:16 UTC
Location: Markneukirchen

Suchergebnisse mit Pfad kopieren?

Post by *Geigolino »

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
User avatar
Dalai
Power Member
Power Member
Posts: 9364
Joined: 2005-01-28, 22:17 UTC
Location: Meiningen (Südthüringen)

Post by *Dalai »

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
#101164 Personal licence
Ryzen 5 2600, 16 GiB RAM, ASUS Prime X370-A, Win7 x64

Plugins: Services2, Startups, CertificateInfo, SignatureInfo, LineBreakInfo - Download-Mirror
Geigolino
Junior Member
Junior Member
Posts: 55
Joined: 2005-10-24, 14:16 UTC
Location: Markneukirchen

Post by *Geigolino »

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
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Geigolino wrote: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.
Vermutung oder ausprobiert?
Denn die Plugins machen genau das.





 
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

VBScript: ForEachSelFileDo - Copy to Target with Path

Post by *Stefan2 »

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'


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







 
Geigolino
Junior Member
Junior Member
Posts: 55
Joined: 2005-10-24, 14:16 UTC
Location: Markneukirchen

Script- File läuft nicht

Post by *Geigolino »

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
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

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.





 
Geigolino
Junior Member
Junior Member
Posts: 55
Joined: 2005-10-24, 14:16 UTC
Location: Markneukirchen

Bin ratlos

Post by *Geigolino »

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
User avatar
Horst.Epp
Power Member
Power Member
Posts: 6450
Joined: 2003-02-06, 17:36 UTC
Location: Germany

Post by *Horst.Epp »

Wozu der ganze Scriptaufwand,
wenn das CopyTree Plugin das ohne Probleme kann
und auch noch einige Zusatzoptionen bietet.
Windows 11 Home x64 Version 23H2 (OS Build 22631.3374)
TC 11.03 x64 / x86
Everything 1.5.0.1371a (x64), Everything Toolbar 1.3.2, Listary Pro 6.3.0.69
QAP 11.6.3.2 x64
Geigolino
Junior Member
Junior Member
Posts: 55
Joined: 2005-10-24, 14:16 UTC
Location: Markneukirchen

Post by *Geigolino »

Hallo Horst,

ich lerne gern was dazu!

Gruß

Udo
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

>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")


---



 
Geigolino
Junior Member
Junior Member
Posts: 55
Joined: 2005-10-24, 14:16 UTC
Location: Markneukirchen

Post by *Geigolino »

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
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

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? :(
Geigolino
Junior Member
Junior Member
Posts: 55
Joined: 2005-10-24, 14:16 UTC
Location: Markneukirchen

Post by *Geigolino »

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
User avatar
Stefan2
Power Member
Power Member
Posts: 4133
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

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?




 
Post Reply