Batch: Kopieren mit teilweise unbekanntem Ziel?
Hallo zusammen,
ich möchte eine Batchdatei erstellen die eine Datei mit einer bekannten Quelle zu einem halb unbekanntem Ziel kopiert. An der Stelle mit dem %% vom Zielpfad gibt es nur einen Unterordner und dieser soll geöffnet werden. Er kann nicht genau angegeben werden weil sich sein Name regelmäßig ändert.
Ich habe derzeit folgendes Skript:
xcopy /Q /C /H /R /Y "C:\Users\Peter\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\icons\icon_48.png" "C:\Users\Peter\AppData\Local\Google\Chrome\User Data\Default\Extensions\oeopbcgkkkdasdawemjljbihmemj\%%\images\icons\"
2 Antworten
@echo off
set "Quelle=C:\Users\Peter\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\icons\icon_48.png"
set "Zielbasis=C:\Users\Peter\AppData\Local\Google\Chrome\User Data\Default\Extensions\oeopbcgkkkdasdawemjljbihmemj\"
for /d %%a in ("%Zielbasis%\*") do (
xcopy /Q /C /H /R /Y "%Quelle%" "%%a\images\icons\"
)
demo.cmd
@echo off
chcp 65001 >nul
rem Ordner/Datei woher die daten kommen...
set "Source=%AppData%\Microsoft\Windows\Start Menu\Programs\icons\icon_48.png"
rem Ordner aus dem der (Unter)Ordner mit unbekanntem Namen ermittelt werden soll:
set "SearchFolder=%LocalAppData%\Google\Chrome\User Data\Default\Extensions\oeopbcgkkkdasdawemjljbihmemj"
rem ermittle OrdnerNamen unter dem angegebene Suchpfad, (hoffendlich ist es wirklich der einzige 🙄)
for /f "tokens=*" %%a in (' dir /b /ad "%SearchFolder%"') do (
echo UnterVerzeichnisName gefunden: "%%a" &rem nur mal anzeigen
echo Die Datei ^(en^) werden nach: "%SearchFolder%\%%a\images\icons\" ! &rem ermittelten Pfad nur mal zum testen anzeigen.
rem wenn das Kommando und die Pfade dir richtig erscheint, entferne das "echo" vor der nächsten Zeile.
echo xcopy /QCHRY "%Source%" "%SearchFolder%\%%a\images\icons\"
)
pause
falls es mehrere Ordner unter dem angegebenen Ordner geben sollte. Kann man beispielsweise versuchen den/die Ordner zu emitteln, welche den (Teil)Pfad "\images" enthalten.
@echo off
chcp 65001 >nul
set "Source=%AppData%\Microsoft\Windows\Start Menu\Programs\icons\icon_48.png"
set "SearchFolder=%LocalAppData%\Google\Chrome\User Data\Default\Extensions\oeopbcgkkkdasdawemjljbihmemj"
rem suche Ordner unter dem angegebene Suchpfad, welche den Ordner Images enthalten
for /f "tokens=*" %%a in (' dir /s /b /ad "%SearchFolder%"^|find "\images" ') do (
echo Die Datei ^(en^) werden nach: "%%a\icons\" kopiert! &rem ermittelten Pfad nur mal zum testen anzeigen.
rem wenn das Kommando und die Pfade dir richtig erscheint, entferne das "echo" vor der nächsten Zeile.
echo xcopy /QCHRY "%Source%" "%%a\images\icons\"
)
pause
Im schlechtesten Fall gibt es mehrere Ordner auf die die find-Bedingung zutrifft, dann wird eben eine copie in jeden der gefundenen Ordner platziert (ach nicht besonders wild.
unter %LocalAppData%\Google\Chrome\User Data\Default\Extensions gibt es mehr Ordner mit mehr oder weniger cryptischen Namen
wenn Du alle in die suche einbeziehen möchtest kannst Du unter der Voraussetzung das der Icons-Ordner immer in deiner Extension existiert auch eine "Etage höher" mit der Suche beginnen und im find-Filter "\images\icons" definieren.
Das Prinzip ist das Gleiche
demo.cmd
@echo off
chcp 65001 >nul
set "Source=%AppData%\Microsoft\Windows\Start Menu\Programs\icons\icon_48.png"
rem diesmal beninnen wir eine Etage höher mit der suche, ferfeinern aber den find-Filter
set "SearchFolder=%LocalAppData%\Google\Chrome\User Data\Default\Extensions"
rem suche Ordner unter dem angegebene Suchpfad, welche den Ordner "Images/Icons" enthalten
for /f "tokens=*" %%a in (' dir /s /b /ad "%SearchFolder%"^|find "\images\icons" ') do (
echo Die Datei ^(en^) werden nach: "%%a\icons\" kopiert!
echo xcopy /QCHRY "%Source%" "%%a\"
)
pause
unerwünschtes kann nicht passieren, da xcopy in diesem zustand nicht ausgeführt wird! Erst nach dem entfernen von "echo" for xcopy wird das Kommando scharf.
Du kannst so beliebig mit den Pfaden und Filtern herumspielen
- die Variablen %AppData" zielt immer auf den Pfad "C:\Users\EinName\AppData\Roaming\"
- die Variablen %LocalAppData" zielt immer auf den Pfad "C:\Users\EinName\AppData\Local"
Angesichts dessen, das (erfahrungsgemäß) die meisten Fragesteller keine Ahnung von Batch (und vor allem for-Loops) haben , hab ich mir angewöhnt die Leute nicht mit einem lapidaren Codeschnipsel auf die weitere Reise zu schicken.
Es gibt gute Gründe, weshalb ich nicht den for/d-Loop nutze. Dieser hat einige Bugs und scheitert bei der Rückgabe von einiger Ordnernamen.
Davon scheinst Du wiederum nichts gehört zu haben... Da ich die Konstellation beim Fragesteller nicht kenne geh ich auf Nummer sicher.
...egal, für den Fragesteller funktioniert Deine Variante.
Was solls..., es macht mir keine besondere Mühe mehrere Optionen aufzuführen, ein Paar Kommentare und "Debug"-Ausgaben für "Anfänger" einzubauen. ...und eine Flexibilisierung über Ordnervariablen macht einen Fragesteller in der Regel nicht dümmer....
Hallo Erzesel,
danke für deine ausführliche Antwort, aber ein einfacher Ansatz hätte gereicht. Der Fragesteller wollte keine Doktorarbeit über Batch-Skripte, sondern eine schnelle und effektive Lösung.
Mein simpler
for /d
-Loop hat funktioniert und der Fragesteller war zufrieden. Es ist beeindruckend, dass du deine umfangreichen Kenntnisse zur Schau stellen willst, aber manchmal ist weniger mehr. Dein komplexer Ansatz kann Anfänger eher verwirren als ihnen zu helfen.
Ist Richtig, verschiedene Optionen zu haben, aber bitte spar dir die überflüssigen Kommentare und die unnötige Komplexität, wenn eine einfache Lösung ausreicht. In der Praxis geht es oft darum, schnell und effizient zu helfen, ohne gleich eine Abhandlung zu schreiben.
Grüße, MasterFAQ
Was hastn du da gebaudd? xd halbe bibel jonge