Verzeichniswechsel aus For-Schleife heraus
Hallo,
folgendes ist der Plan!
Ich möchte in einer "komplexen" Verzeichnisstruktur alle Dateien mit der Bezeichnung "CMakeLists.txt" finden und auf den jeweiligen Pfaden relative Pfade bilden.
Mit Hilfe dieser relativen Pfanden sollen dann neue Verzeichnisse erstellt werden.
Z.B.
Aus C:\MyWorkspace\Verzeichnis1\SubVerzeichnis23\CMakeLists.txt extrahiere ich (evtl. weiß jemand wie ich das Problem schöner lösen kann)
Verzeichnis1\SubVerzeichnis23 (<<== RelPath aus Code). Daraus erzeuge ich das neue Verzeichnis D:\WorkspaceNeu\Verzeichnis1\SubVerzeichnis23 (D:\WorkspaceNeu\!RelPath!).
Bis dahin laüft alles recht gut.
Nun soll aus der For-Schleife heraus in das neu erzeugte Verzeichnis gesprungen werden, und von dort irgendwas gemacht werden.
In meinem Beispiel erzeuge ich mittels CMake VS Projektdateien. Diese sollen in dem neu angelegten Verzeichnis landen.
Das CMakeLists.txt dazu liegt im ursprünglichen Pfad.
%CMAKE_CMD% und %CMAKE_GENERATOR% sind gesetzt!
Leider kann ich offensichtlich mittels cd /D %TARGET_DIR%\!RelPath! aus der For-Schleife heraus nicht in ein anderes Verzeichnis wechseln.
Gibt es dafür eine Lösung?
Wo gibt es in meinem Code noch Verbesserungsmöglichkeiten?
Vielen Dank schon mal für eure Hilfe.
Gruß,
Mario
folgendes ist der Plan!
Ich möchte in einer "komplexen" Verzeichnisstruktur alle Dateien mit der Bezeichnung "CMakeLists.txt" finden und auf den jeweiligen Pfaden relative Pfade bilden.
Mit Hilfe dieser relativen Pfanden sollen dann neue Verzeichnisse erstellt werden.
Z.B.
Aus C:\MyWorkspace\Verzeichnis1\SubVerzeichnis23\CMakeLists.txt extrahiere ich (evtl. weiß jemand wie ich das Problem schöner lösen kann)
Verzeichnis1\SubVerzeichnis23 (<<== RelPath aus Code). Daraus erzeuge ich das neue Verzeichnis D:\WorkspaceNeu\Verzeichnis1\SubVerzeichnis23 (D:\WorkspaceNeu\!RelPath!).
Bis dahin laüft alles recht gut.
Nun soll aus der For-Schleife heraus in das neu erzeugte Verzeichnis gesprungen werden, und von dort irgendwas gemacht werden.
In meinem Beispiel erzeuge ich mittels CMake VS Projektdateien. Diese sollen in dem neu angelegten Verzeichnis landen.
Das CMakeLists.txt dazu liegt im ursprünglichen Pfad.
%CMAKE_CMD% und %CMAKE_GENERATOR% sind gesetzt!
@echo off & setlocal enabledelayedexpansion
set WORKSPACE=C:\MyWorkspace
set TARGET_DIR=D:\WorkspaceNeu
pushd .
cd /D %WORKSPACE%
for /f "delims=" %%i in ('dir /s /b "CMakeLists.txt"') do (
set "RelPath=%%i"
set "RelPath=!RelPath:%WORKSPACE%\=!
set "RelPath=!RelPath:\CMakeLists.txt=!
if not exist %TARGET_DIR%\!RelPath! mkdir %TARGET_DIR%\!RelPath!
pushd .
cd /D %TARGET_DIR%\!RelPath!
%CMAKE_CMD% -G %CMAKE_GENERATOR% %WORKSPACE%\!RelPath!\CMakeLists.txt
popd
)
popd
pause
:END
echo DONE
Leider kann ich offensichtlich mittels cd /D %TARGET_DIR%\!RelPath! aus der For-Schleife heraus nicht in ein anderes Verzeichnis wechseln.
Gibt es dafür eine Lösung?
Wo gibt es in meinem Code noch Verbesserungsmöglichkeiten?
Vielen Dank schon mal für eure Hilfe.
Gruß,
Mario
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 138359
Url: https://administrator.de/contentid/138359
Ausgedruckt am: 19.11.2024 um 20:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo Mario.Steinberg!
Wenn der Wechsel des Verzeichnisses aus anderen Gründen wichtig sein sollte, dann zumindest mit der dafür vorgesehenen Verwendung von "
Dass sich am Ende von !RelPath! dadurch noch ein "\" befindet, kannst Du zur Not auch ignorieren ...
Grüße
bastla
Wenn der Wechsel des Verzeichnisses aus anderen Gründen wichtig sein sollte, dann zumindest mit der dafür vorgesehenen Verwendung von "
pushd
":pushd "%TARGET_DIR%\!RelPath!"
%CMAKE_CMD% -G %CMAKE_GENERATOR% %WORKSPACE%\!RelPath!\CMakeLists.txt
popd
Wo gibt es in meinem Code noch Verbesserungsmöglichkeiten?
Es sollte eigentlich genügen, den Pfad der gefundenen Datei als Ausgangspunkt zu nehmen (und damit die Zeile 12 einzusparen):set "RelPath=%%~dpi"
set "RelPath=!RelPath:%WORKSPACE%\=!
Grüße
bastla
Hallo Mario.Steinberg!
Meine ersten 3 Zeilen waren als Ersatz für Deine nochmals dargestellten 4 Zeilen gedacht (die zwar auch funktionieren sollten, aber Du hattest ja nach Verbesserungsmöglichkeiten gefragt ) ...
... ansonsten dürfte das Problem aber darin liegen, dass mit "%CMAKE_CMD%" vermutlich ein anderer Batch gestartet wird; wenn dem so ist, dann bitte ein "
da anderenfalls kein Rücksprung in die Schleife erfolgt.
Grüße
bastla
Meine ersten 3 Zeilen waren als Ersatz für Deine nochmals dargestellten 4 Zeilen gedacht (die zwar auch funktionieren sollten, aber Du hattest ja nach Verbesserungsmöglichkeiten gefragt ) ...
... ansonsten dürfte das Problem aber darin liegen, dass mit "%CMAKE_CMD%" vermutlich ein anderer Batch gestartet wird; wenn dem so ist, dann bitte ein "
call
" davor, also:call %CMAKE_CMD% -G %CMAKE_GENERATOR% %WORKSPACE%\!RelPath!\CMakeLists.txt
Grüße
bastla
Hallo Mario.Steinberg!
Mit Verspätung (und noch dazu nur oberflächlich getestet) :
Grüße
bastla
Mit Verspätung (und noch dazu nur oberflächlich getestet) :
@echo off & setlocal enabledelayedexpansion
set WORKSPACE=C:\MyWorkspace
set TARGET_DIR=D:\WorkspaceNeu
set "Done=%temp%\Done.txt"
pushd %WORKSPACE%
copy nul "%Done%">nul
for /f "delims=" %%i in ('dir /s /b "CMakeLists.txt"') do (
echo %%~fi|findstr /L /G:"%Done%">nul 2>nul || (
set "RelPath=%%~dpi"
>>"%Done%" echo !RelPath!
set "RelPath=!RelPath:%WORKSPACE%\=!
if not exist %TARGET_DIR%\!RelPath! mkdir %TARGET_DIR%\!RelPath!
pushd %TARGET_DIR%\!RelPath!
%CMAKE_CMD% -G %CMAKE_GENERATOR% %WORKSPACE%\!RelPath!
popd
)
)
popd
:END
echo DONE
echo\
echo Verarbeitet wurden:
type "%Done%"
pause
bastla
Moin bastla, moin Mario.Steinberg,
wenn du jetzt aber das Setzen der Variable %RelPath% richtigerweise auf den Pfad beschränkst (ohne Dateiname/Extension),
dann muss in Zeile 16
IMHO gehen Skripte immer in die Grütze, wenn das Verhältnis verwendeter Variablen zu verwendeten Kommentarzeilen (der sogenannte Munter-Runter-Klimper-Koeffizient MRKK) einen Wert >= 10 annimmt oder gar einen #Div/0!#-Error wirft.
Siehe Marios "warum-auch-immer"-Fehlersuche einen Kommentar zuvor.
Grüße
Biber
wenn du jetzt aber das Setzen der Variable %RelPath% richtigerweise auf den Pfad beschränkst (ohne Dateiname/Extension),
dann muss in Zeile 16
%CMAKE_CMD% -G %CMAKE_GENERATOR% %WORKSPACE%\!RelPath!
... wieder der (feste, immer gleiche) Name "CMakeLists.txt" an das Ende gestellt werden.IMHO gehen Skripte immer in die Grütze, wenn das Verhältnis verwendeter Variablen zu verwendeten Kommentarzeilen (der sogenannte Munter-Runter-Klimper-Koeffizient MRKK) einen Wert >= 10 annimmt oder gar einen #Div/0!#-Error wirft.
Siehe Marios "warum-auch-immer"-Fehlersuche einen Kommentar zuvor.
Grüße
Biber
Hallo Mario.Steinberg und Biber!
Wenn Bibers Vermutung hinsichtlich der Zeile 16 zutrifft (woran ich keineswegs zweifle - ich hatte mich nur an die Erfolgsmeldung im letzten Kommentar von Mario.Steinberg gehalten), sollte sich diese Zeile eigentlich auf
reduzieren lassen ...
Grüße
bastla
Wenn Bibers Vermutung hinsichtlich der Zeile 16 zutrifft (woran ich keineswegs zweifle - ich hatte mich nur an die Erfolgsmeldung im letzten Kommentar von Mario.Steinberg gehalten), sollte sich diese Zeile eigentlich auf
%CMAKE_CMD% -G %CMAKE_GENERATOR% "%%i"
Grüße
bastla
[OT]
@bastla
Biber
[/OT]
@bastla
Zitat von @bastla:
ich hatte mich nur an die Erfolgsmeldung im letzten Kommentar von Mario.Steinberg gehalten
Ich will mal so sagen: tagespolitische Meldungen wie "Die Gespräche fanden in konstruktiver Atmosphäre statt" oder "Die Folgen der Krise müssen überwunden werden" wie auch Aussagen aus dem Entwickler-Bereich "Es funktioniert - warum auch immer." würde ich nicht automatisch als "Erfolgsmeldungen" bezeichnen. ich hatte mich nur an die Erfolgsmeldung im letzten Kommentar von Mario.Steinberg gehalten
Grüße
bastla
Grüße zurückbastla
Biber
[/OT]
@Biber
[OT]
Es funktioniert ..." ist auf jeden Fall ein Erfolg - früher stand da in solchen Fällen ja eher "Es funtzt ..."
[/OT]
Grüße
bastla
[OT]
Es funktioniert ..." ist auf jeden Fall ein Erfolg - früher stand da in solchen Fällen ja eher "Es funtzt ..."
[/OT]
Grüße
bastla