Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Gewisse Ordner kopieren und relativen Pfad erhalten. Wie?

Frage Entwicklung Batch & Shell

Mitglied: ADiewi

ADiewi (Level 1) - Jetzt verbinden

17.08.2009, aktualisiert 12:41 Uhr, 6080 Aufrufe, 9 Kommentare

Hallo,

Ich habe gerade angefangen ein bisschen mit batch zu programmieren (schon eine ziemliche Umstellung von C),
und bin dabei auf euer Forum gestoßen. Sind wirklich gute Tipps zu finden, leider passte noch keiner genau auf
mein Problem.

Also, ich habe zwei Ordner (z.B old und new). Im Ordner old befinden sich ältere Programmdateien, sowie Lokalisierungsordner,
im Ordner new die neuen Programmdateien. Die Struktur von old und new sieht folgendermaßen aus:

old
|---ordner1
| |---programmordner
| |---lokalisierungsordner
|---ordner2
| |---programmordner
| |---lokalisierungsordner

Die Lokalisierungsordner haben immer den gleichen Namen.
Ziel ist es alle Lokalisierungsordner mitsamt Pfad in den Ordner new zu kopieren, damit dort die Lokalisierung auch vorhanden ist.

Habe nun schon die folgende Batch-Datei geschrieben:
01.
dir *407 /s /a d /B >> list.txt 
02.
for /f "tokens=5* delims=\" %%a in (list.txt) do ( 
03.
xcopy %%a\%%b newdir\%%b /I /H /E /Y 
04.
)
Das Problem ist nun, dass ich dieses skript nur in einer gewissen ordnertiefe ausführen kann (siehe tokens).
Ich habe schon versucht die strings in list.txt mit dem Set Befehl zu bearbeiten, um relative Pfade zu bekommen, hat
aber nicht funktioniert, da ich innerhalb des Set Befehls (z.B SET var=%%%a:%STR%=%) Variablen verwenden muss,
was er offensichtlich gar nicht mag.

Ich hoffe das war einigermaßen verständlich erklärt und mir kann jemand helfen.

Grüße
Mitglied: 60730
17.08.2009 um 12:53 Uhr
Servus,

warum "so" umständlich?

xcopy quelle\*407 ziel\ /I /H /E /Y

sollte doch das gleiche bringen?

Gruß
Bitte warten ..
Mitglied: bastla
17.08.2009 um 16:42 Uhr
Hallo ADiewi und willkommen im Forum!
hat aber nicht funktioniert, da ich innerhalb des Set Befehls (z.B SET var=%%%a:%STR%=%) Variablen verwenden muss, was er offensichtlich gar nicht mag.
Daran scheitert's erst später (außer Du verwendest zusätzlich ein "call") - zunächst einmal kannst Du für Schleifenvariablen keine Ersetzungen vornehmen (und, ganz nebenbei, auch keine Teilstrings bilden), daher zunächst in eine "gewöhnliche" Variable übertragen:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Ordner 1\Ordner 2\Ordner 3\old" 
03.
set "Ziel=D:\Neuer Ordner1\Neuer Ordner2\new" 
04.
for /f "delims=" %%a in ('dir /s /b /ad "%Quelle%\*407"') do call :ProcessDir "%%a" 
05.
goto :eof 
06.
 
07.
:ProcessDir 
08.
set "Absolut=%~1" 
09.
call set "Relativ=%%Absolut:%Quelle%\=%%" 
10.
xcopy /e /h /y %1 "%Ziel%\%Relativ%\">nul 
11.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: ADiewi
17.08.2009 um 20:25 Uhr
Danke für die nette Begrüßung!

@TimoBeil:
Der kurze Befehl klappt leider nicht, da ich einen Ordner habe, der die Packete enthält, die wiederrum den Lokalisierungsordner enthält.
Xcopy nimmt aber * als Platzhalter für die Packetordner nicht an. Aber Danke.

@bastla:

Die Lösung hat super funktioniert. Ich hab den Code nur noch etwas modifizert, damit man auch einen Ordner daraufziehen kann und es
das aktuelle Verzeichnis als Arbeitsverzeichnis benutzt.

Super, wie schnell einem hier geholfen wird

01.
@echo off & setlocal 
02.
 
03.
set "Locale=0407" 
04.
set "Quelle=%CD%\Old_Packages" 
05.
if "%1" NEQ "" set "Quelle=%1" 
06.
set "Ziel=%CD%\New_Packages" 
07.
for /f "delims=" %%a in ('dir /s /b /ad "%Quelle%\%Locale%"') do call :ProcessDir "%%a" 
08.
goto :eof 
09.
 
10.
:ProcessDir 
11.
set "Absolut=%~1" 
12.
call set "Relativ=%%Absolut:%Quelle%\=%%" 
13.
xcopy /e /h /y %1 "%Ziel%\%Relativ%\">nul 
14.
goto :eof
Bitte warten ..
Mitglied: ADiewi
17.08.2009 um 21:44 Uhr
Eine Frage hat sich jetzt doch noch ergeben.
Die Packetordner tragen sowohl Namen als auch Versionsnummer (z.B. Packet_Name_1_00_1_2).
Wenn sich nun die Versionsnummer ändert, werden die Lokalisierungsordner nicht mehr in den
zugehörigen Packetordner kopiert, sondern es wird ein neuer erstellt, der nur den Lokalisierungsordner enthält.
Kann man die Versionsnummer enfernen?

Ich habe mir so etwas überlegt, allerdings wird der Platzhalter nicht akzeptiert.
Ich bekomme die Fehlermeldung: Datei 0407 nicht gefunden.

01.
REM @echo off & setlocal 
02.
 
03.
set "Locale=0407" 
04.
set "Source=%CD%\OldPackages" 
05.
if "%1" NEQ "" set "Source=%1" 
06.
set "Target=%CD%\NewPackages" 
07.
for /f "tokens=1,2 delims=_" %%a in ('dir /s /b /ad "%Source%\%Locale%"') do call :ProcessDir "%%a_%%b*\%Locale%" 
08.
goto :eof 
09.
 
10.
:ProcessDir 
11.
set "Absolute=%~1" 
12.
call set "Relative=%%Absolute:%Source%\=%%" 
13.
echo %Relative% 
14.
xcopy /e /h /y %1 "%Target%\%Relative%\">nul 
15.
pause 
16.
goto :eof
Bitte warten ..
Mitglied: bastla
17.08.2009 um 21:57 Uhr
Hallo ADiewi!

Dem Unterprogramm "ProcessDir" musst Du noch den vollständigen Pfad zum jeweiligen Ordner übergeben, aber Du kannst ja die Zerlegung dann für %Relative% vornehmen ...

... was dann etwa so aussehen könnte:
for /f "tokens=1* delims=\" %%a in ("%Relative%") do for /f "tokens=1,2 delims=_" %%i in ("%%a") do set "TargetAbsolute=%Target%\%%i_%%j\%%b\"
[Edit] Voraussetzung ist allerdings, dass sich der zu zerlegende Teil am Anfang des Relativpfades befindet ... [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: ADiewi
18.08.2009 um 00:08 Uhr
Danke für die Antwort, bastla.

Ich habe den Code jetzt angepasst, komme aber nicht wirklich weiter. Ich denke das Problem liegt darin, dass ich die Relative Variable so anpassen
müsste, dass der Name des Paketordners im Ziel des Xcopy Befehls erhalten bleibt, aber die neue Versionsnummer aus dem neuen Verzeichnis
verwendet wird. Es würde hier genügen nach dem ersten '_' die Versionsnummer anzuhängen, da die meisten Pakete ohne Unterstrich im Name
auskommen, und den Rest dann manuell zu verschieben. Leider funktionieren Platzhalter im Verzeichnisnamen nicht, anders als bei Unix (schon eine
ziemliche Umstellung).

[Edit]Ach ja, die alten Packetordner sehen in etwa so aus: Packet_1_00_2, die neuen Packet_1_03_1.[/Edit]

Hier der Code:
01.
REM @echo off & setlocal 
02.
 
03.
set "Locale=0407" 
04.
set "Source=%CD%\OldPackages" 
05.
if "%1" NEQ "" set "Source=%1" 
06.
set "Target=%CD%\NewPackages" 
07.
for /f "delims=" %%a in ('dir /s /b /ad "%Source%\%Locale%"') do call :ProcessDir "%%a" 
08.
goto :eof 
09.
 
10.
:ProcessDir 
11.
set "Absolute=%~1" 
12.
call set "Relative=%%Absolute:%Source%\=%%" 
13.
for /f "tokens=1* delims=\" %%a in ("%Relative%") do for /f "tokens=1,2 delims=_" %%i in ("%%a") do set "TargetAbsolute=%Target%\%%i_%%j\%%b\" 
14.
echo %Relative% 
15.
xcopy /e /h /y %1 "%TargetAbsolute%\">nul 
16.
pause 
17.
goto :eof
Ich hoffe du hast die Geduld mir da nochmal zu helfen

Gruß
ADiewi
Bitte warten ..
Mitglied: bastla
18.08.2009 um 14:29 Uhr
Hallo ADiewi!

Das könnte mit dem folgenden (ungetesteten) Unterprogramm gehen:
01.
:ProcessDir 
02.
set "Absolute=%~1" 
03.
call set "Relative=%%Absolute:%Source%\=%%" 
04.
for /f "delims=_" %%i in ("%Relative%") do set "Packet=%%i" 
05.
set "Version=" 
06.
for /f "tokens=1* delims=_" %%i in ('dir /b /ad "%Target%\%Packet%_*.*"') do set "Version=_%%j" 
07.
for /f "tokens=1* delims=\" %%i in ("%Relative%") do set "TargetAbsolut=%Target%\%Packet%%Version%\%%j\" 
08.
xcopy /e /h /y %1 "%TargetAbsolute%\">nul 
09.
goto :eof
Das Einbeziehen des "_" in die Variable %Version% ist zwar nicht ganz sauber, verkürzt das Ganze aber, da ansonsten vorweg geprüft werden müsste, ob es im behandelten "Packet (inkl. Version)"-Ordnernamen tatsächlich einen "_" gibt ...

... wäre dies allerdings als sicher anzunehmen, dann besser so:
01.
:ProcessDir 
02.
set "Absolute=%~1" 
03.
call set "Relative=%%Absolute:%Source%\=%%" 
04.
for /f "delims=_" %%i in ("%Relative%") do set "Packet=%%i" 
05.
for /f "tokens=1* delims=_" %%i in ('dir /b /ad "%Target%\%Packet%_*.*"') do set "Version=%%j" 
06.
for /f "tokens=1* delims=\" %%i in ("%Relative%") do set "TargetAbsolut=%Target%\%Packet%_%Version%\%%j\" 
07.
xcopy /e /h /y %1 "%TargetAbsolute%\">nul 
08.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: ADiewi
18.08.2009 um 22:11 Uhr
Danke, bastla
Ich werde den Code ausprobieren,sobald ich wieder zuhause bin. Schaut schon mal sehr vielversprechend aus.
Ich melde mich dann in zwei Tagen wieder.

Grüße,
ADiewi
Bitte warten ..
Mitglied: ADiewi
22.08.2009 um 11:30 Uhr
So, wieder da

Ein dickes Danke an dich bastla!!
Das Skript funktioniert nun wie gewünscht, ich musste nur noch in der letzten for-Schleife TargetAbsolut durch TargetAbsolute ersetzten.
Ich poste hier auch mal die fertige Version.
01.
@echo off & setlocal 
02.
 
03.
set "Locale=0407" 
04.
set "Source=%CD%\OldPackages" 
05.
if "%1" NEQ "" set "Source=%1" 
06.
set "Target=%CD%\NewPackages" 
07.
for /f "delims=" %%a in ('dir /s /b /ad "%Source%\%Locale%"') do call :ProcessDir "%%a" 
08.
goto :eof 
09.
:ProcessDir 
10.
set "Absolute=%~1" 
11.
call set "Relative=%%Absolute:%Source%\=%%" 
12.
for /f "delims=_" %%i in ("%Relative%") do set "Packet=%%i" 
13.
for /f "tokens=1* delims=_" %%i in ('dir /b /ad "%Target%\%Packet%_*.*"') do set "Version=%%j" 
14.
for /f "tokens=1* delims=\" %%i in ("%Relative%") do set "TargetAbsolute=%Target%\%Packet%_%Version%\%%j\" 
15.
xcopy /e /h /y %1 "%TargetAbsolute%\">nul 
16.
goto :eof
Bitte warten ..
Ähnliche Inhalte
Visual Studio
Vb.net Relativen Pfad in Absoluten Pfad umwandeln
Frage von ahstaxVisual Studio2 Kommentare

Hallo, Ich versuche mit VB (vb.net 2010), eine MSG-Datei in ein PDF umzuwandeln. Das klappt ganz gut, wenn man ...

Batch & Shell
Powershell Dateien mit Pfad in ein Ordner kopieren
gelöst Frage von windelterroristBatch & Shell6 Kommentare

Hallööchen :) Beschäftige mich gerade mit Powershell Ich möchte Dateien mit dem Archivbit = 1 in ein Testordner kopieren ...

Batch & Shell
Nach bestimmten Ordner namen suchen und in einem anderem Pfad kopieren
gelöst Frage von erdgnrftBatch & Shell8 Kommentare

Hallo zusammen, ich bin neu hier und mit der Bach-Programmierung habe ich auch nicht viel Erfahrung. Habe folgendes Problem: ...

Microsoft
Batch Datei zum Kopieren bestimmter ordner mit Pfad
gelöst Frage von eivloxMicrosoft6 Kommentare

Hallo zusammen , Hab schon ein bisschen gegoogled aber nichts passendes gefunden . Folgendes Problem: Ich möchte einen Ordner ...

Neue Wissensbeiträge
Microsoft Office

Office 2010 Starter erneut auf einer frischen Windows-Version installieren

Tipp von Lochkartenstanzer vor 1 TagMicrosoft Office9 Kommentare

Moin, vor ein paar Tagen schlug bei mir ein Kunde auf, der sein Widnows 7 geschrottet und es inklusive ...

Datenbanken

Upgrade MongoDB 3.4 auf 3.6

Erfahrungsbericht von Frank vor 1 TagDatenbanken

Seit kurzem gibt es das 3.6 Update für die MongoDB: Sicherheit, das Sortieren, Aggregation und auch die Performance wurde ...

SAN, NAS, DAS

Backdoor Zugang und Upload-Bug in vielen Western Digital MyCloud Geräten

Information von Frank vor 1 TagSAN, NAS, DAS2 Kommentare

James Bercegay von der Firma Gulftech hat die Fehler an Western Digital gemeldet und das Unternehmen stellt bereits ein ...

Microsoft Office

Outlook 2016 - Beim Weiterleiten keine PDF Anhänge mehr - KB4011626 entfernen

Erfahrungsbericht von Deepsys vor 1 TagMicrosoft Office3 Kommentare

Wenn ihr feststellt das ihr beim Weiterleiten von E-Mails keine PDF Anhänge mehr versendent, dann dankt Microsoft. Diese tolle ...

Heiß diskutierte Inhalte
Netzwerke
NTFS-Berechtigung
Frage von Daoudi1973Netzwerke23 Kommentare

Hallo zusammen und frohes neues Jahr (Sorry, ich bin spät dran) Meine Frage: 1- Ich habe einen Ordner im ...

Drucker und Scanner
Gesucht DIN A3 Drucker
Frage von NebellichtDrucker und Scanner15 Kommentare

Hallo, ich möchte einen neuen DIN A3 Drucker kaufen. Um ab und zu, ca. 1 mal die Woche Farbausdrucke ...

iOS
Einladung vom iphone kalender
Frage von jensgebkeniOS15 Kommentare

Hallo Gemeinschaft, folgendes Problem - immer wenn ich von meinem Iphone einen Termin einztrage und diesem Termin Teilnehmer zuweise, ...

Windows Netzwerk
Drucker isolieren in Windows Domäne
gelöst Frage von lcer00Windows Netzwerk14 Kommentare

Hallo zusammen, habe eine Windows-AD (2012R2) in der es einen Druckerserver gibt. Mittlerweile verliere ich das Vertrauen in die ...