Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 6057 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 ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...