CMD: for mit dir verstümmeln das Resultat, falls Blanks darin vorkommen

Mitglied: Berner

Berner (Level 1) - Jetzt verbinden

21.01.2021 um 16:04 Uhr, 574 Aufrufe, 5 Kommentare

Hallo
Unter Windows 10 Pro
Ich möchte meinen 20 seitigen CMD Quellcode etwas kürzen und bin dabei auf folgendes Problem gestossen:
Wenn ich beim Command Prompt
dir /b /s "C:\batchfiles\Versuchs Ordner eins" eintippe erhalte ich alle Pfade, wo der gesuchten Ordner gefunden wurde und zwar mit eventuell vorkommenden Blanks.
Also als Resultat, z.B. wenn der Ordner zwei Mal vorkommt
C:\batchfiles\Versuche\Versuchs Ordner eins
C:\batchfiles\Versuche\Versuchsordner\Versuchs Ordner eins

Dabei würde mir der erst gefundene Pfad als Resultat genügen.

Wenn ich in einer Batchdatei den folgenden Skript verfasse, erhalte ich als Resultat in der Variablen zwar genau nur den ersten gefundenen Pfad, aber der Ordnername wird vor dem ersten Blank abgeschnitten:
for /f %%i in ('dir /b /s "C:\batchfiles\Versuchs Ordner eins"') do (
set Resultat=%%i
)
Ergibt:
C:\batchfiles\Versuche\Versuchs

Mit dem Parameter "usebackq" habe ich keinen Erfolg, ebenso mit den zur Verfügung stehenden Parameter des dir-Befehls.
Kann der for-Befehl mit einem folgenden dir so abgeändert werden, dass in der Variable der vollständige Pfad abgelegt wird?

Über Umwege ist das auch möglich, wenn in der Resultat-Variablen der String <Versuchs> mit <Versuchs Ordner eins> (%Suchordner%) ausgetauscht wird, z.B. mit

set Resultat=%Resultat:Versuchs=Versuchs Ordner eins%. Das Ersetzen der beiden Strings links und rechts vom Gleichheitszeichen mit entsprechenden Variablen geht aber nicht, so dass man eher die Resultat-Variable ergänzt mit set / f tokens=2* vom Suchordner, also mit <Ordner eins>

Aber die kürzeste und einfachste Lösung ist meistens die beste Lösung

Vielen Dank für eure Tipps
Mitglied: Friemler
21.01.2021, aktualisiert um 16:56 Uhr
Hallo @Berner,

wenn Du öfter (und viel) Batchscript-Code schreibst, solltest Du Dich intensiv mit der FOR-Schleife beschäftigen, um das grundlegende Konzept vor allem von FOR /f zu verstehen (Stichwörter: Tokens und Trennzeichen/Delimiters).

Schau mal in das Kapitel Die Mehrzweck-Variante, FOR /F meines Tutorial zur FOR-Schleife rein, da solltest Du die Lösung finden. Ich könnte sie Dir auch vorkauen, Du lernst aber nur etwas, wenn Du selbst drauf kommst.

Grüße
Friemler
Bitte warten ..
Mitglied: Berner
21.01.2021 um 17:01 Uhr
Vielen Dank Friemler
Habe gesehen, dass Du das Problem umfangreich beschreibst. Werde es im Verlauf des frühen Abends genau studieren. Melde mich nochmals!
Gruss
Berner / Nicolas
Bitte warten ..
Mitglied: Berner
21.01.2021 um 21:23 Uhr
Hallo Friemler
Habe mir Dein umfangreiches Tutorial zur Brust genommen. Dabei bin ich auf eine (fast) Lösung gestossen. Fast, weil ich in der Variablen nicht das erst Gefundene sondern das zweit Gefundene vorfinde.

for /f "delims=" %%f in ('dir /b /s "C:\batchfiles\Versuchs Ordner eins"') do echo=%%f
Diese Zeile in einer Batchdatei ergibt alle gefundenen Ordner in der folgenden Reihenfolge:
C:\batchfiles\Versuche\Versuchs Ordner eins
C:\batchfiles\Versuche\Versuchsordner\Versuchs Ordner eins

for /f "delims=" %%f in ('dir /b /s "C:\batchfiles\Versuchs Ordner eins"') do set Resultat=%%f
Diese Zeile in einer Batchdatei ergibt den zweit gefundenen Ordner:
C:\batchfiles\Versuche\Versuchsordner\Versuchs Ordner eins

Bin ich auf dem Holzweg?
Danke für Deinen Input
Bitte warten ..
Mitglied: Friemler
LÖSUNG 22.01.2021 um 09:58 Uhr
Hallo @Berner,

nein, kein Holzweg, Du hast schlicht noch ein Verständnisproblem. Die Schleife läuft, wie Schleifen das so machen ;-) face-wink , mehrmals durch, und zwar so lange bis alle Daten verarbeitet sind. Eine Variable, die Du in der Schleife setzt, hat nach der Schleife natürlich den zuletzt hineingeschriebenen Wert, in Deinem Fall also das letzte gefundene Verzeichnis.

Da Dich anscheinend nur das erste Verzeichnis interessiert, fallen mir zwei Optionen ein:

  1. Nach der Zuweisung an die Variable mit einem GOTO-Befehl aus der Schleife herausspringen. Das soll aber angeblich nicht gut sein, da das zu irgendwelchem Fehlverhalten des Batchscript-Interpreters führen könnte (ich persönlich habe das aber noch nicht erlebt).
  2. Du kombinierst den DIR-Befehl mit einem FINDSTR-Kommando, der die ausgegebenen Zeilen zählt. Die Zuweisung machst Du dann nur bei der ersten Zeile.

Lösung Nummer 2 sähe dann ungefähr so aus:

Die Analyse wie und warum das funktioniert überlasse ich Dir als Hausaufgabe. Tipp: Das Tutorial zur FOR-Schleife und die Hilfe zum FINDSTR-Befehl lesen.

Grüße
Friemler
Bitte warten ..
Mitglied: Berner
23.01.2021 um 18:26 Uhr
Hallo Friemler
Vielen Dank für Deine Hilfe. Beide Vorschläge funktionierten auf Anhieb.
Ich weiss nicht was ich überlegt habe, aber auf Deine Erklärung, warum nicht das Erstgefundene in der Variablen steckt, hätte ich selber kommen müssen, da der FOR-Befehl solange Loops ausführt wie die Bedingung erfüllt ist, und somit notgedrungen das Letztgefundene in der Variable stecken wird. Das war etwas schwach von mir...
Tatsächlich wurde auch mir vor vielen Jahren an einem Programmierkurs für Datenbanken eingetrichtert, dass man Loops nicht mit einem Sprung verlassen sollte, sondern den Loop weiterlaufen lassen soll, bis die Bedingung nicht mehr erfüllt ist. Ein Verlassen mit einem Sprung sei instabil und unprofessionell und könne mit Erstellen eines vorgängigen Struktogramms (z.B. Nassi Shneiderman oder Jackson) umgangen werden. Da die Programme kompiliert wurden (*.exe) waren sie keine Stapelverarbeitungsdateien mehr und vielleicht genau deswegen anfällig für Sprünge aus Schlaufen.
Ich selber habe aber auch schon in Batchdateien im SET-Befehlein ein goto (unmittelbar nach der Variablenzuweisung) verwendet, und dabei noch nie Probleme mit dem "restlichen" Programm gehabt. Da Batchdateien top-down verarbeitet werden, glaube ich auch eher, dass ein Sprung aus einem Loop eher unschön als problematisch ist. Das ist aber nur meine Meinung...
Danke nochmals
Nicolas (Berner)
Bitte warten ..
Heiß diskutierte Inhalte
Linux
Installation Grammm Server
smeclntVor 1 TagFrageLinux13 Kommentare

Hallo zusammen, meine Linux Kenntnisse sind sehr rudimentär trotzdem suche ich eigentlich ständig nach einer Alternative zu MS Exchange. Bis jetzt gab es nichts ...

Switche und Hubs
Probleme im Netzwerk Switche teilweise nicht erreichbar
hukimanVor 10 StundenFrageSwitche und Hubs29 Kommentare

Guten Morgen, seit Monaten haben wir hier immer wieder Probleme mit dem Netzwerk, das Problem konnte ich leider aber noch immer nicht finden. Es ...

Erkennung und -Abwehr
Einer Malware auf der Spur. Benötige Sherlock Holmes!
streamVor 22 StundenFrageErkennung und -Abwehr7 Kommentare

Guten Abend Wenn ich meine Windows-10-Kiste starte, so gibt mir mein Router eine Meldung aus, dass eine bestimmte IP-Adresse wegen Bösartigkeit geblockt wurde. Auf ...

Windows 10
Windows 10 interes Mikro ohne Funktion
TPH125Vor 1 TagFrageWindows 1011 Kommentare

Hallo zusammen, Ich verzweifelt bald. Besitze einen Medion Akoya MD 97110. Habe Windows 10 installiert, seit dem funktioniert das inigrierte Mikrofon nicht mehr. Gerät ...

Batch & Shell
Tabellarische Ausgabe der Netzwerkschnittstellen
gelöst dysti99Vor 8 StundenFrageBatch & Shell18 Kommentare

Mit - ip a - werden ja die Netzwerkschnittstellen angezeigt. Ich möchte mit ein Batchscript folgende Ausgabe erreichen: 1 eth0 192.168.1.1 AD:13:67:56:14:D1 2 eth1 ...

Festplatten, SSD, Raid
(USB) Festplatten laut ?
TomEngelVor 1 TagFrageFestplatten, SSD, Raid6 Kommentare

Ich grüsse Sie Alle. Eine Frage eines engagierten Laien Habe mehrere 3,5 " Festplatte. Einige schon recht alt 8 Jahre, andere ca 2-3 jahre ...

Ubuntu
Mailserver Test Provider IP
gelöst it-blzVor 1 TagFrageUbuntu9 Kommentare

Hallo, ist es möglich einen "Mailserver" (Imap + smtp) in einer Virtual Box mit einer Provider IP (dynamisch - ist allerdings konstant) zu testen? ...

Hardware
DisplayPort zu USB-C Adapter Converter
gelöst felixhuth-itVor 1 TagFrageHardware11 Kommentare

Hallo liebe Gemeinde Ich habe da ein kleines Problemchen. Der Kunde wollte einen 14 Zoll Monitor mit Touch in Verbindung mit einem Mini PC ...