Verzeichnisname in Batch-Datei zur weiteren Verarbeitung in Variable speichern

mischaef

Kassettenkind
Teammitglied
Registriert
Aug. 2012
Beiträge
6.110
Moin zusammen,

hänge seit gestern abend an einem Problem, zu dem ich einfach keine Lösung finde: In einem Verzeichnis liegen weitere Verzeichnisse, deren Name oder Pfad in einer Batch-Datei in eine Variable, welche im Laufe des Scripts verarbeitet wird, gespeichert werden soll. Das bekomme ich aber einfach nicht hin. Ich habe mir den dir-Befehl angeschaut, komme dort aber nur bis zu dem Verzeichnis, in dem die Batch-Datei liegt - aber nicht weiter. Ich kann auch nicht mit absoluten Pfaden in der Batch arbeiten, da sich der Speicherort immer wieder ändern kann. Dabei soll das Verzeichnis, in der die Batch liegt, als "Startverzeichnis" agieren.

Hat jemand eine Idee, wie ich das machen kann?

Besten dank!

Michael
 
Wenn ich das in der Erklärung aber richtig lese, gibt das nur den Pfad BIS zur Batch-Datei aus, ich möchte ja die Namen der noch darüber liegenden Verzeichnisse haben (eine Ebene)....

Oder sehe ich das falsch?
 
Das kommt dem ganzen schon ein wenig näher. Zumindest klappt jetzt das abarbeiten damit. Das einzige Problem: In %%a wird ja der ganze Pfad gespeichert, ich bräuchte aber für die weitere Verarbeitung den Namen des darüber liegenden Ordners in einer Variable speichern.

Ich könnte das ganze jetzt per FOR-Schleife trennen, aber das würde ja eine feste Struktur des Pfades voraussetzen...gibt es hier keine Möglichkeit zu sagen, dass nur der letzte Teil des Pfades genommen werden soll, lang dieser ist? Oder die Backslashs im Pfad zählen und daraus die Länge ableiten? Nur so ein Gedanke, der sicherlich viel zu komplizier gedacht ist...^^
 
Wenn du mit Beispielen arbeiten würdest, wäre das schneller verständlich.

Also du hast die Datei C:\pfad\zur\batch.bat. %~dp0 entspricht C:\pfad\zur\. Du willst nun aber nur den Namen des darüberliegenden Ordners zur haben?
Code:
set path_self=%~dp0
for %%i in (%path_self:~0,-1%) do set name_parent=%%~nxi
Oder was definierst du als "darüber"?
 
mischaef schrieb:
Das kommt dem ganzen schon ein wenig näher. Zumindest klappt jetzt das abarbeiten damit. Das einzige Problem: In %%a wird ja der ganze Pfad gespeichert, ich bräuchte aber für die weitere Verarbeitung den Namen des darüber liegenden Ordners in einer Variable speichern.
  1. Nimm den Pfad der Variable
  2. Springe in den Ordner per cd von dieser Variablen
  3. Mache ein cd ..
  4. Merke Dir das in einer neuen Variablen.
 
Ok, soweit bin ich bis jetzt gekommen...

Code:
@echo off

chcp 1252

for /r %%a in (.) do (

pushd %%a

cd

  echo Variable: %%a

  for %%i in (.) do set ordner=%%~nxi
  echo Ordner: %ordner%

  ABARBEITUNG

popd

)

pause

Es soll dabei folgendes passieren: Die Batch liegt in einem Ordner, welcher wiederum Ordner enthält.

Batch-Ordner
-- Ordner1
-- Ordner2
-- Ordner3

ect...

In diesen Ordnern befinden sich Daten, die verarbeitet weredn sollen. Dafür muss aber in den jeweiligen Ordner gesprungen und gleichzeitig sein Name in einer Variable gespeichert werden. Das abarbeiten klappt bereits, nur der Ordnernamen wird einfach nicht ausgelesen.

Wenn ich die Batch in einem der Ordner starte, dann wird mit

Code:
 for %%i in (.) do set ordner=%%~nxi

der Ordnernamen wunderbar ausgelesen, aber nicht innerhalb der Batch oben.
 
@mischaef:
Füge in Zeile 2 folgendes ein: SETLOCAL ENABLEDELAYEDEXPANSION
Wenn du im Laufe des Codes die Variable "Ordner" abfragen musst, dann ab sofort nur !ordner! nutzen, nicht %ordner%! Das funktioniert aber nur zusammen mit dem Code in Zeile 2 (s.o.).

Warum diese Änderung? Variablen, die innerhalb von IF- oder FOR-Schleifen geändert werden und auch innerhalb der gleichen Schleife abgefragt werden, haben weiterhin den alten Inhalt. Erst nach Abschluss der IF-/FOR-Schleife (und übergeordneten Schleifen, wenn mehrere Schleifen verschachtelt sind) wird der Inhalt der Variablen aktualisiert.

Mit dem "SETLOCAL ENABLEDELAYEDEXPANSION" wird eine Aktualisierung des Variableninhalts auch innerhalb von IF-/FOR-Schleifen durchgeführt, aber die Variablen müssen dann mit !Variablennamen! aufgerufen werden, nicht mehr mit %-Zeichen.

-----------------------------------------------------

Zeile 13 kannst du einfach mit einem set ordner=!cd! ersetzen. Oder du arbeitest einfach generell mit !cd!, ohne der Erstellung der Variable "ordner".
 
Zuletzt bearbeitet: (%cd% durch !cd! ersetzt. Und viel Text hinzugefügt.)
  • Gefällt mir
Reaktionen: skorpion68, NotNerdNotDau und mischaef
Vielleicht bin ich müde, und es ist nicht elegant…
Was spricht dagegen die ordner mit DIR /D /B > DIR.DAT in eine Datei zu schreiben, die mit FOR /F in %D (DIR.DAT) DO … auszuwerdten um so an die Ordnernamen zu kommen? Den Rest steuern die Eingangs benannten Variablen bei.

Und die Hilfsdatei kann live angelegt und wieder gelöscht werden. Batch und die Verbesserungen ab WNT/2k dunnemals kann viel, aber bei diesen Kleinigkeiten steht es da wie Pik7 im Wald.

Variablen als Container sind nett, aber effektiv müsste auch eine Feldvaribale in einer Schleife gemäß oben abgefrühstückt werden. Muss ich dies nicht mehrfach tun hat eine Variable keine nahrhaften Vorteile.

Ich fluche wegen des Problems hier auch öfter selbst und würde auf WSH/VBS ausweichen, aber verusche da mal schnöde Dateien zu kopieren…

CN8

PS: ich las, dass man keine BAT-Dateien mehr benutzt sondern stattdessen CMDs 😉
 
  • Gefällt mir
Reaktionen: mischaef
Ich bin zwar jetzt schon ein paar Jahre raus aus der Batch-Geschichte, aber mit den Infos, die hier gegeben wurden, würde ich es dennoch hinbekommen.

Ich frage mich zwar immer, warum man für derartige Vorhaben nicht PowerShell benutzt, weil sich vieles damit viel einfacher, übersichtlicher und zuverlässiger umsetzen lässt als mit diesem altbackenen Batch.
Aber egal, muss ja letztendlich jeder selbst entscheiden.

cumulonimbus8 schrieb:
PS: ich las, dass man keine BAT-Dateien mehr benutzt sondern stattdessen CMDs
Das ist egal, was die Funktionsweise betrifft.
Der Unterschied ist nur, dass das .bat-Format kompatibel vom aktuellen Windows bis runter zu MS-DOS ist und .cmd erst ab WinNT.
 
Ich finde, dass Batch von der Syntax einigermaßen einfach ist. Auch VBA als Beispiel empfinde ich als Laie einigermaßen einfach.

Aber PowerShell empfinde ich als schwierig, die Syntax ist für mich nicht intuitiv. Ich könnte mit vorstellen, dass es anderen evtl. so ähnlich sehen.
Aber vielleicht liegt es auch nur daran, dass ich mir nie richtig Mühe mit dem Einarbeiten gegeben habe.
 
Zuletzt bearbeitet:
Darkman.X schrieb:
Aber PowerShell empfinde ich als schwierig, die Syntax ist für mich nicht intuitiv. Ich könnte mit vorstellen, dass es anderen evtl. so ähnlich sehen.
Alles eine Sache der Einarbeitung und Gewohnheit.
Ich bin kein Programmierer und empfinde PS als sehr leicht erlernbar. Ging mir mit Batch/CMD bis vor ein paar Jahren aber auch nicht anders, ging auch sehr leicht von der Hand.
Ich kenne allerdings aktuell keinen, der PowerShell und Batch/CMD kann und nicht PS verwendet.

Wie erwähnt, muss es jeder selbst entscheiden und eine Für- und Widerdiskussion bringt ja nun nichts.
 
Zurück
Oben