nick.b
Goto Top

Komplette Ordner kopieren über Kontextmenü

Hallo,

Ich habe in meinem Kontextmenü ein paar Einträge um die Datei, die angeklickt wird von A nach B zu kopieren. Dazu hatte ich 2 Fragen:

1. Gibt es bei diesem Kopieren eine Möglichkeit cmd.exe unsichtbar auszuführen? Man kann das ja bei Programmen wie Bat-to-Exe-Converter auswählen wenn man eine bestimmte Batch datei hat. Ist dies auch irgendwie über Tricks möglich auch cmd.exe unsichtbar zu erstellen?

2. Wenn ich beim kopieren über das Kontextmenü einen Ordner auswähle werden natürlich nur die Dateien die sich darin befinden an die andere Stelle kopiert. Ist es irgendwie möglich, dass ein Ordner an der Zielstelle erstellt wird und die Dateien dort hinein kopiert werden. Also das wirklich der ganze Ordner und nicht nur die Datein kopiert werden.
Bis jetzt benutze ich über die Registry den Befehl cmd.exe copy "%0" "C:\Users\XY\Desktop\" /Y... Allerdings bekommt man natürlich bei "%0" nur den kompletten Pfad ausgegeben. Kann man daraus dann den Ordnernamen extrahieren oder so??

MfG Nick

Content-ID: 357581

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

Ausgedruckt am: 25.11.2024 um 14:11 Uhr

Pedant
Pedant 08.12.2017 um 19:31:23 Uhr
Goto Top
Hallo Nick,

Zitat von @Nick.B:
Wenn ich beim kopieren über das Kontextmenü einen Ordner auswähle werden natürlich nur die Dateien die sich darin befinden an die andere Stelle kopiert. Ist es irgendwie möglich, dass ein Ordner an der Zielstelle erstellt wird und die Dateien dort hinein kopiert werden. Also das wirklich der ganze Ordner und nicht nur die Datein kopiert werden.
Welches merkwürdie Betriebssystem nutzt Du?
Wenn Du unter Windows Dateien kopierst, werden Dateien kopiert
und wenn Du Ordner kopierst werden Ordner kopiert.

Zitat von @Nick.B:
Allerdings bekommt man natürlich bei "%0" nur den kompletten Pfad ausgegeben. Kann man daraus dann den Ordnernamen extrahieren oder so?
Den Ordernamen oder so kann man so extrahieren:
https://ss64.com/nt/syntax-args.html

Gruß Frank
Nick.B
Nick.B 08.12.2017 um 21:11:59 Uhr
Goto Top
Hallo,

Danke für deine Antwort!

Ich nutze Windows 10 Home.
Ich habe mich wohl bei meiner Beschreibung nicht präzise genug ausgedrückt.
Ich habe mir beim Kontextmenü einen neuen Eintrag erstellt. Dieser sorgt mit dem Befehl:

cmd.exe /s /c copy "%0" "C:\Users\XY\OrdnerXY" /Y ; dafür, dass die angewählte Datei immer an den selben Ort (hier: OrdnerXY) verschoben wird. Da ich ja ganz normal über diesen Befehl cmd.exe aufrufe ist die Eingabeaufforderung natürlich zu sehen und da wollte ich halt fragen ob es, sozusagen cmd.exe in unsichtbar gibt.

MfG Nick
Pedant
Lösung Pedant 08.12.2017 um 21:40:11 Uhr
Goto Top
Hallo Nick,

Zitat von @Nick.B:
cmd.exe /s /c copy "%0" "C:\Users\XY\OrdnerXY" /Y ; dafür, dass die angewählte Datei ... verschoben wird
copy kopiert, es wird also Nichts verschoben.

Zitat von @Nick.B:
Ich habe mich wohl bei meiner Beschreibung nicht präzise genug ausgedrückt.
siehe oben.

Zitat von @Nick.B:
...da wollte ich halt fragen ob es, sozusagen cmd.exe in unsichtbar gibt.
Es gibt Wege die cmd.exe versteckt auszuführen, aber das Hilfsmittel, das das macht, ist dann zumindest beim Aufruf der cmd.exe nicht versteckt.
Ein "Aufblitzen" eines "Dos"-Fensters wirst Du nicht vermeiden können, aber der angestoßende Kopiervorgang könnte im "Versteckten" zuende geführt werden.
Er ließe sich dann aber weder kontrollieren noch abbrechen, noch wüsstest Du wann er tatsächlich fertig ist.

Alternativ könnest Du Dein cmd-Aufruf mit start /min ergänzen, dann würde der Kopiervorgang minimiert in der Taskleist ablaufen.
Das halte ich für den besseren Weg, das ist aber nur ein Vorschlag.

Gruß Frank
Nick.B
Nick.B 08.12.2017 um 21:59:11 Uhr
Goto Top
Nochmals danke für deine Antwort Frank,

Das mit start /min hatte ich auch schon überdacht, allerdings gab es dann immer einen Fehler, da start /min nicht erkannt wurde. Habe es jetzt aber nochmal überdacht und mit: cmd.exe /s /c start /min cmd.exe /s /c copy "%0" "C:\Users\XY\OrdnerXY" /Y
funktioniert es jetzt auch.

Vielen Dank schonmal bis dahin!

Das Problem mit dem kompletten Ordner über einen eigenen Kontextmenüeintrag kopieren, bekomme ich leider immer noch nicht hin, da er den Parameter "%~p1" der eigentlich der richtige wäre irgendwie nicht erkennt... Statt dem Ordnernamen wird dann einfach %~p1 ausgeschrieben.
Was mache da ich falsch??

MfG Nick
Pedant
Pedant 09.12.2017 um 13:35:47 Uhr
Goto Top
Hallo Nick,

Zitat von @Nick.B:
Statt dem Ordnernamen wird dann einfach %~p1 ausgeschrieben.
Was mache da ich falsch??
An so einer Stelle habe ich das noch nicht genutzt.
Probier mal diese Varianten aus:
"%%~p1"'%~p1''%%~p1'
und testweise mal diese ohne Anführungszeichen
%~p1%%~p1
wobei die Letzeren nur bei Verzeichnissen ohne im Namen enthaltene Leerzeichen funktionieren würden.


Wie verhält es sich denn, wenn Du /s weglässt?
cmd.exe /s /k echo "%0"
cmd.exe /s /k echo "%~p1"
versus
cmd.exe /k echo "%0"
cmd.exe /k echo "%~p1"


Wenn das nicht hilft, könntest Du die Aufgabe in eine Batchdatei verlagern und diese aus dem Kontexmenü heraus aufrufen.
cmd.exe /c start "Kopieren" /d "C:\Program Files (x86)\Tools" /min MeineKopier.cmd "%0"
So solltest Du mit %0 machen können, was Du willst.
Bei der Lösung müsstest Du allerdings nicht nur den Reg-Eintrag haben, sondern eben auch die Datei MeineKopier.cmd.


Eine ganz einfache Lösung wäre auch, Du erstellst Dir in diesem Ordner
C:\Users\XY\AppData\Roaming\Microsoft\Windows\SendTo\
eine Verknüpfung zum Ordner
C:\Users\XY\Desktop\
und nennst sie beispielsweise "OrdnerXY".
Dann kannst Du ganz einfach über das Kontextmenü -> Senden an -> OrdnerXY
alles Mögliche dorthinkopieren.
Das funktioniert dann auch, wenn Du mehrere Dateien und/oder Ordner markiert hast.
Alles Markierte wird dann kopiert.
Es wird auch kopiert und nicht verschoben wenn Quelle und Ziel auf demselben Laufwerk liegen.

Gruß Frank
Nick.B
Nick.B 09.12.2017 um 13:55:34 Uhr
Goto Top
Hallo Frank,

Danke für die vielen Lösungsmöglickeiten.
Zitat von @Pedant:

Hallo Nick,
An so einer Stelle habe ich das noch nicht genutzt.
Probier mal diese Varianten aus:
"%%~p1"'%~p1''%%~p1'
und testweise mal diese ohne Anführungszeichen
%~p1%%~p1
wobei die Letzeren nur bei Verzeichnissen ohne im Namen enthaltene Leerzeichen funktionieren würden.


Wie verhält es sich denn, wenn Du /s weglässt?
cmd.exe /s /k echo "%0"
cmd.exe /s /k echo "%~p1"
versus
cmd.exe /k echo "%0"
cmd.exe /k echo "%~p1"

Ich habe alles davon ausprobiert, allerdings läuft das nicht. Ich denke ich muss mich mit einer extra .bat oder .exe Datei anfreunden die dann darüber aufgerufen wird.

Mir ist übrigens noch aufgefallen, dass die ganzen Parameter wie "%~p1" auch in einer Batch Datei nicht funktionieren, vielleicht wurden die bei Windows 10 rausgeschmissen oder so. Die Parameter "%0" ; "%1" oder "%~dp0" funktionieren dabei übrigens einwandfrei. Ich habe keine Ahnung woran das liegt...

Du hast da auch zufällig keine Erklärung für oder??

MfG Nick
Pedant
Lösung Pedant 09.12.2017 um 14:34:29 Uhr
Goto Top
Hallo Nick,

Zitat von @Nick.B:
Du hast da auch zufällig keine Erklärung für oder??
Nein, ich habe Eine.
Zitat von @Nick.B:
"%~p1"
Du hast statt des 0. Parameters den 1. Parameter genutzt.
Den gibt es aber in diesem Fall nicht.
Das war mir leider zunächst nicht aufgefallen und ich habe es sogar in meinem Kommentar übernommen.

%~p1 bezieht sich auf %1.
Wenn Du %0 verwenden möchtest, dann musst Du auch %~p0 schreiben.

Das bringt Dich zurück zum Start und zur Wiederholung Deiner bisherigen Tests.

"Senden an" gefällt Dir nicht?

Gruß Frank
Nick.B
Nick.B 09.12.2017 um 15:58:17 Uhr
Goto Top
Hallo Frank,

Das erklärt natürlich einiges... Dann werde ich mal ein bisschen rumprobieren!

"Senden an" funktioniert glaube ich nicht weil ich ja z.B.:

Einmal "C:\Users\XY\Desktop\OrdnerXY" nach "C:\Test\OrdnerXY" kopieren möchte aber auch:

"C:\Users\XY\Desktop\OrdnerXZ" nach "C:\Test\OrdnerXZ"

Es soll also der Ordner Name erkannt werden damit an einer bestimmten Stelle der gleiche Ordner erstellt wird und der Ordnerinhalt dort rein kopiert wird. Allerdings ist der Ordner Name nicht immer der gleiche... Also sollte der Ordnername erkannt werden von dem Ordner der dann ausgewählt wird und da %0 immer den ganzen Pfad angibt und nicht nur den Ordnernamen wollte ich halt wissen ob es dafür einen Parameter gibt.

MfG Nick
rubberman
Lösung rubberman 09.12.2017 um 16:49:20 Uhr
Goto Top
Als "copy_folder.vbs" in "%APPDATA%\Microsoft\Windows\SendTo"
Option Explicit
Dim oFSO
If WScript.Arguments.Count <> 1 Then WScript.Quit
Set oFSO = CreateObject("Scripting.FileSystemObject")  
If Not (oFSO.FolderExists(WScript.Arguments(0))) Then WScript.Quit
CreateObject("WScript.Shell").Run "robocopy.exe """ & WScript.Arguments(0) & """ ""C:\Test\" & _  
  oFSO.GetFileName(WScript.Arguments(0)) & """ *.* /e /r:1 /w:1", 0, False  
Hast du dann im "Senden an" Kontextmenü. Das Script nutzt ROBOCOPY, führt es aber im unsichtbaren Fenster aus.

Steffen
Nick.B
Nick.B 09.12.2017 um 16:52:08 Uhr
Goto Top
Hallo Steffen,

Vielen Dank für dein Antwort!

MfG Nick