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 Batch-SubRoutine - übergeordneten Ordner-Namen in Variable

Mitglied: stkrueger

stkrueger (Level 1) - Jetzt verbinden

13.11.2007, aktualisiert 19.08.2016, 8791 Aufrufe, 5 Kommentare, 1 Danke

Hallo zusammen,

habe nun schon mehrere Stunden mit Recherchen und Versuchen verbracht, und leider noch nichts gefunden, daher wende ich mich an euch hier in der Runde

Ich brauche für mein Backup-Batch eine Subroutine, welche mir den aktuellen übergeordneten Ordner in eine Variable wegschreibt, damit ich diese wieder an einen neuen Pfad anhängen kann.

Hier ein Beispiel:

Ich stehe in "C:\Test-Ordner\Test-Daten\Test-Sonstwas\1234\zuSichernde-Daten"
und bräuchte nun den Namen des Unterordners "zuSichernde-Daten" in einer Variable hier z.B. %varLastPfad%

Ich habe etwas funktionierendes zusammengebastelt, was ich aber als ein bißchen unschön empfinde, da bei meiner Lösung die maximale Pfad-Tiefe auf 26 Ebenen (auf Grund der For-Schleife und den Buchstaben) limitiert ist:

01.
:Sub_UeberOrdner_ermitteln 
02.
	echo !date!-!time!: DEBUG: ----------------------{BEGIN: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1 
03.
	pushd "!varSource!" 
04.
	for /f "tokens=1-26 delims=\" %%a in ('cd') do ( 
05.
		if not "%%z"=="" (set varLastPfad=%%z& goto :catched_UeberOrdner) 
06.
		if not "%%y"=="" (set varLastPfad=%%y& goto :catched_UeberOrdner) 
07.
		if not "%%x"=="" (set varLastPfad=%%x& goto :catched_UeberOrdner) 
08.
		if not "%%w"=="" (set varLastPfad=%%w& goto :catched_UeberOrdner) 
09.
		if not "%%v"=="" (set varLastPfad=%%v& goto :catched_UeberOrdner) 
10.
		if not "%%u"=="" (set varLastPfad=%%u& goto :catched_UeberOrdner) 
11.
		if not "%%t"=="" (set varLastPfad=%%t& goto :catched_UeberOrdner) 
12.
		if not "%%s"=="" (set varLastPfad=%%s& goto :catched_UeberOrdner) 
13.
		if not "%%r"=="" (set varLastPfad=%%r& goto :catched_UeberOrdner) 
14.
		if not "%%q"=="" (set varLastPfad=%%q& goto :catched_UeberOrdner) 
15.
		if not "%%p"=="" (set varLastPfad=%%p& goto :catched_UeberOrdner) 
16.
		if not "%%o"=="" (set varLastPfad=%%o& goto :catched_UeberOrdner) 
17.
		if not "%%n"=="" (set varLastPfad=%%n& goto :catched_UeberOrdner) 
18.
		if not "%%m"=="" (set varLastPfad=%%m& goto :catched_UeberOrdner) 
19.
		if not "%%l"=="" (set varLastPfad=%%l& goto :catched_UeberOrdner) 
20.
		if not "%%k"=="" (set varLastPfad=%%k& goto :catched_UeberOrdner) 
21.
		if not "%%j"=="" (set varLastPfad=%%j& goto :catched_UeberOrdner) 
22.
		if not "%%i"=="" (set varLastPfad=%%i& goto :catched_UeberOrdner) 
23.
		if not "%%h"=="" (set varLastPfad=%%h& goto :catched_UeberOrdner) 
24.
		if not "%%g"=="" (set varLastPfad=%%g& goto :catched_UeberOrdner) 
25.
		if not "%%f"=="" (set varLastPfad=%%f& goto :catched_UeberOrdner) 
26.
		if not "%%e"=="" (set varLastPfad=%%e& goto :catched_UeberOrdner) 
27.
		if not "%%d"=="" (set varLastPfad=%%d& goto :catched_UeberOrdner) 
28.
		if not "%%c"=="" (set varLastPfad=%%c& goto :catched_UeberOrdner) 
29.
		if not "%%b"=="" (set varLastPfad=%%b& goto :catched_UeberOrdner) 
30.
		if not "%%a"=="" (set varLastPfad=%%a& goto :catched_UeberOrdner) 
31.
32.
	:catched_UeberOrdner 
33.
	echo !date!-!time!: DEBUG: Der uebergeordnete Ordner lautet '!varLastPfad!'>>"%varLogFile%" 2>&1 
34.
	popd 
35.
	echo !date!-!time!: DEBUG: -----------------------{ENDE: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1 
36.
goto :eof
Kleine Erklärung meines Gedankenansatzes:
1. Ich springe in den auszulesenden Pfad mit "pushd"
2. zerhacke diesen an den Stellen mit "\" und legen ihn in einzelne Variablen a-z mit
"for /f "tokens=1-26 delims=\" %%a in ('cd') do..."
3. Diese Variablen durchlaufe ich von hinten nach vorne, um bei der ersten Füllung einer Variable diese zu speichern und aus der For-Schleife rauszuhüpfen.
4. Rücksprung in den Ursprungsordner und fertig.

Das geht doch bestimmt noch eleganter und ohne Limitierung, oder?

Die maximale Limitierung mit der ich leben könnte wäre folgendermaßen begründet:
Ich weiß ja, dass Pfade maximal 253-255 Zeichen lang sein dürfen. Das wäre also demnach bei einer "Ordner-Namens-Länge" von minimum einem Zeichen so ca. 127 Ebenen ( 255 / 2, wenn ein Ordner-Name aus einem Zeichen plus "\" besteht), d.h. wenn ich maximal mit 128 Ebenen arbeiten könnte, wäre das Prima und Ziel erfüllt.

Oder habe ich mich mittlerweile schon total verrannt und es geht ganz anders?

Vielen Dank im Voraus für eure Hilfe Ich kann mir gut vorstellen, dass die "Götter der Einzeiler und For-Schleifen" hier was passendes für mich haben, ohne das mir noch mehr graue Haare wachsen

Liebe Grüße
Stefan
Mitglied: Biber
13.11.2007 um 12:26 Uhr
Moin Stefan,

ich denke, es ließe sich ein bisschen zusammendampfen.
Wie wäre es mit folgender Strategie (Beispiel am CMD-Prompt):
01.
(=12:24:00  D:\temp\test\test\1.1\ebene1\unterEbene2\Nochtiefer=) 
02.
>for /d %i in (.) do @echo [ÜberOrdner] %~dpi ------------ dieserOrdner[%~nxi] 
03.
[ÜberOrdner] D:\temp\test\test\1.1\ebene1\unterEbene2\ ------------ dieserOrdner[Nochtiefer]
Grüße
Biber
Bitte warten ..
Mitglied: stkrueger
13.11.2007 um 13:21 Uhr
Servus Biber,

vielen lieben Dank für die Super-Schnelle-Antwort, und wie nicht anders von Dir zu erwarten:

BINGO!!! Es funktioniert!
War wohl doch so, dass ich den Wald vor lauter Bäumen nicht gesehen habe...

Hier die neue Subroutine:
01.
:: Übergabewert: 
02.
:: !varSource! = Quellpfad, dessen übergeordneter Ordner ermittelt werden soll. 
03.
:: 
04.
:: Ergebniswert: 
05.
:: !varLastPfad! = Name des übergeordneten Ordners. 
06.
:: 
07.
:Sub_UeberOrdner_ermitteln 
08.
	echo !date!-!time!: DEBUG: ----------------------{BEGIN: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1 
09.
	pushd "!varSource!" 
10.
	for /d %%A in (.) do set varLastPfad=%%~nxA 
11.
	echo !date!-!time!: DEBUG: Der uebergeordnete Ordner lautet '!varLastPfad!'>>"%varLogFile%" 2>&1 
12.
	popd 
13.
	echo !date!-!time!: DEBUG: -----------------------{ENDE: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1 
14.
goto :eof
Nun nochmal in Prosa, damit ich das richtig verstehe:

1. Ich springe in den auszulesenden Pfad mit "pushd"

2.a. das "for /D" bearbeitet nur Verzeichnisse, was hier ja auch von nöten ist (und ich völlig übersehen habe)

2.b. "in (.)" bezeichnet das aktuelle Verzeichnis

2.c. "%~nxA" Erweitert %A nur zu einem Dateinamen und Dateinamenerweiterung, was dazu führt, dass der aktuelle Ordner aus dem gesamten Ordner-Pfad "herausgeschnitten" wird.

3. Rücksprung in den Ursprungsordner und fertig.

Ist das so richtig? Wenn ja, kann der Thread hier als 'gelöst' deklariert werden!

Dank euren tollen Forums und solcher fruchtbaren Beiträge konnte ich mein Know-How gerade in diesem Bereich "Batch" hier um Welten noch verbessern. Meinen herzlichen Dank dafür! *klatsch*
(Mußte als Stammleser und Postings-Neuling hier auch mal gesagt werden)

Liebe Grüße
Stefan
Bitte warten ..
Mitglied: Biber
13.11.2007 um 14:08 Uhr
Moin Stefan,

vollkommen richtig so.
Als Ergänzung (mit einem Pfadbeispiel, das ich gerade in einem anderen Thread verwendet habe):
01.
(=14:05:41  D:\temp\test\test\1.1\ebene1\unterEbene2\Nochtiefer=) 
02.
>for /d %i in ("c:\Programme\Ahead\Nero") do @echo [%~dpi] [%~nxi] 
03.
[c:\Programme\Ahead\] [Nero] 
04.
>for /d %i in ("c:\Programme\Ahead\Nero") do @for /d %j in ("%~dpi\.") do @echo %~dpj ---[%~nxj] 
05.
c:\Programme\ ---[Ahead] 
06.
 

--> Du brauchst nicht unbedingt diese Wechselei mit PushD/PopD machen für diese FOR /D -Anweisung.

Grüße und danke für die Blumen
Biber
Bitte warten ..
Mitglied: stkrueger
13.11.2007 um 14:35 Uhr
Servus Biber,

keine Ursache: Ehre, wem Ehre gebührt

klar, logisch, hab ich verstanden... ist so natürlich noch kürzer. Sehr fein! Wie war das doch gleich mit den "Göttern der Einzeiler und For-Schleifen"?? *gg*

Also hier nochmal die eingedampfte Fassung:

Hier die neue Subroutine:
01.
:: Übergabewert: 
02.
:: !varSource! = Quellpfad, dessen übergeordneter Ordner ermittelt werden soll. 
03.
:: 
04.
:: Ergebniswert: 
05.
:: !varLastPfad! = Name des übergeordneten Ordners. 
06.
:: 
07.
:Sub_UeberOrdner_ermitteln 
08.
	echo !date!-!time!: DEBUG: ----------------------{BEGIN: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1 
09.
 
10.
	for /d %%A in (!varSource!) do (set varLastPfad=%%~nxA) 
11.
 
12.
	echo !date!-!time!: DEBUG: Der uebergeordnete Ordner lautet '!varLastPfad!'>>"%varLogFile%" 2>&1 
13.
	echo !date!-!time!: DEBUG: -----------------------{ENDE: Sub_UeberOrdner_ermitteln}---------------------->>"%varLogFile%" 2>&1 
14.
goto :eof
Auch hier nochmal die Übersetzung, damit alle was davon haben:

Zerpflücken wir diesen schicken Einzeiler, der uns die Aufgabe erfüllt:

01.
for /d %%A in (!varSource!) do set varLastPfad=%%~nxA
1. das "for /d" bearbeitet nur Verzeichnisse, was hier ja auch von nöten ist

2. "in (!varSource!)" bezeichnet das zu zerhackende Verzeichnis, dessen übergeordneter Ordner ermittelt werden soll.

3. "do (set varLastPfad=%%~nxA)" erweitert %%A (zwei '%' da innerhalb eines Batches) zu nur einem Dateinamen (%~n) und Dateinamenerweiterung (%~x), was dazu führt, dass der aktuelle Ordner aus dem gesamten Ordner-Pfad "herausgeschnitten" wird und ordnet dieses Ergebnis der Variablen 'varLastPfad' zu. Fertig!

Grüße und vielen Dank für die Unterstützung
Stefan
Bitte warten ..
Mitglied: evinben
19.08.2016, aktualisiert um 14:49 Uhr
Auf der Schnelle findet man oben nicht wirklich die konkrete Lösung zum Hauptproblem aus der Titel "Batch-SubRoutine - übergeordneten Ordner-Namen in Variable", d. h. nur den Namen eines Überordners in Variable zu setzen.

Mein Beispiel wäre wie folgt (den Text am besten in eine .bat-Datei einfügen und ausführen):
01.
 
02.
:>D:\Ebene1\Ebene2\Ebene3\File.exe 
03.
for /d %%i in ("%~dp0\File.exe") do ( 
04.
	echo Ordnerpfad:			%%~dpi 
05.
	echo Dateiname:			%%~nxi 
06.
07.
:Ordnerpfad:		D:\Ebene1\Ebene2\Ebene3\ 
08.
:Dateiname:			File.exe 
09.
echo. 
10.
 
11.
for /d %%i in (.) do ( 
12.
	echo Pafd Überordner:		%%~dpi 
13.
	echo Ordnername:			%%~nxi 
14.
15.
echo. 
16.
:Pafd Überordner:	D:\Ebene1\Ebene2\ 
17.
:Ordnername:		Ebene3 
18.
 
19.
echo und nochmal das Gleiche nur auf anderer Art: 
20.
echo. 
21.
for /d %%i in ("%~dp0") do for /d %%j in ("%%~dpi\.") do ( 
22.
	echo Pafd Überordner:		%%~dpj 
23.
	echo Ordnername:			%%~nxj 
24.
25.
:Pafd Überordner:	D:\Ebene1\Ebene2\ 
26.
:Ordnername:		Ebene3 
27.
echo. 
28.
 
29.
for /d %%i in (..) do ( 
30.
	echo Pafd ÜberÜberordner:		%%~dpi 
31.
	echo Überordnername:			%%~nxi 
32.
33.
echo. 
34.
:Pafd ÜberÜberordner:	D:\Ebene1\ 
35.
:Überordnername:		Ebene2
Nur als "meine 2 Cent dazu".
Vielleicht ist dies jemandem doch nützlich.

Viele Grüße
Nik
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Batch: alle Ordner mit einem bestimmten Namen kopieren

gelöst Frage von RemsboysBatch & Shell4 Kommentare

Hallo zusammen, ich würde gerne eine Batch-Datei erstellen, mit der ich aus einem Ordner alle Unterverzeichnisse die den Namen ...

Batch & Shell

Ordner und Datei Name gleich (BATCH)

gelöst Frage von clragonBatch & Shell12 Kommentare

Hey Leute. Simples Problem; Bat to Exe Converter ist nicht sehr sauber. Trotzdem nützlich. Es räumt die Dateien und ...

Batch & Shell

Namen der Unterverzeichnisse in verschiedene Variable einlesen mittels Batch

gelöst Frage von gerry56Batch & Shell8 Kommentare

Hallo und ein schönes Wochenende. Ich merke leider, daß ich schon länger nichts mehr mit DOS (Batch) erstellt habe. ...

Batch & Shell

Wie Device name in Variable einfügen

gelöst Frage von it-fisiBatch & Shell6 Kommentare

Hallo, ich möchte per Batch file mit ADB auf mein Android Handy zugreifen. Zur Prüfung ob die Verbindung besteht ...

Neue Wissensbeiträge
Multimedia & Zubehör
AVM Fritz USB WLAN Sticks schneller einschalten
Tipp von NetzwerkDude vor 1 TagMultimedia & Zubehör4 Kommentare

Die AVM Fritz WLAN Sticks haben in der Firmware 2 Modis: Einmal als Massenspeicher und einmal als WLAN Netzwerkkarte ...

Windows Server

Windows Server Backup schlögt Fehl -Lösung 2008-2016

Tipp von BiGnoob vor 1 TagWindows Server

Hi zusammen , ich möchte gerne einen Lösungstipp abgeben für folgenden fehler: lösung ist folgende:

Humor (lol)
Telekom vs. O2 - 3:2
Erfahrungsbericht von the-buccaneer vor 2 TagenHumor (lol)4 Kommentare

Unglaublich aber wahr: Nachdem mein privater Anschluss am 19.04.18 auf VOIP und VDSL umgestellt wurde, hatte ich seitdem 1,5 ...

Batch & Shell

Windows 10 Heimnetzgruppe abgeschaft. Ein Script für einfache Netzwerk - Freigabe im Heimnetzwerk

Anleitung von treehe vor 2 TagenBatch & Shell3 Kommentare

Anleitung für eine einfache Netzwerkfreigabe unter Windows 10 Wie weiter hab mal ein kleines CMD - Script gebastelt. Womit ...

Heiß diskutierte Inhalte
Windows Server
Windows Server 2012 - Update - Beim Booten bleibt der Server beim Windows Zeichen stehen
Frage von KeilbachWindows Server17 Kommentare

Hallo Zusammen, ich grüße euch, mein Name ist Michele. Ich bin hier ganz Neu - da ich einfach nicht ...

PHP
Nach umzug zu 1und1 bekomme ich beim eintrag in die db tab folgendsen fehler
Frage von jensgebkenPHP14 Kommentare

INSERT command denied to user 'dbo42342342342234244'@'212.227.109.173' for table 'orders'

Windows Server
2003er RDS Server lässt alten ThinClient nach Updates nicht mehr anmelden
Frage von KnorkatorWindows Server9 Kommentare

Hallo zusammen, wir hatten die Aufgabe, ein System (keine Domänenanbindung) zu virtualisieren welches mehrere Jahre keine Updates gesehen hat. ...

VB for Applications
Per Button klick Wert in Zelle eintragen, erneutes klicken Wert wieder entfernen
gelöst Frage von HainoonVB for Applications8 Kommentare

Hallo zusammen, Ich Frage mich, ob es möglich ist mit dem selben Button einen Wert in eine Zelle einzutragen ...