virgil
Goto Top

Per Batch Pfad suchen und diesen Übernehmen

Hallo, dies ist dann auch gleich mal meine erste Frage hier im Forum :-P

Ähm, also folgendes möchte ich per Batch realisieren:

Ich möchte per Batch-Datei bestimmte Verzeichnissen auf bestimmten Laufwerken (unterschiedliche Pfade) in einer Text-Datei auflisten
Also:

Laufwerk D:\aaa\bbb\ccc\ddd
Laufwerk E:\aaa\bbb\ccc\ddd\eee
Laufwerk F:\aaa\bbb
Laufwerk G:\aaa\b_b\c_c\d_d\e_e\fff
usw.

--> das ist soweit kein Problem
::Aber::

Problem:
Da die Auflistung öfter aktualsiert wird, weil neue Verzeichnisse hinzukommen oder Alte gelöscht werden, soll das Ganze zukunftssicher sein
- Durch Formatierung und Neuaufsetzen des Systems oder neu Patitionierung oder Verschieben der kompletten Ordnerstrukturen auf andere Partitionen müsste der Pfad zu den Verzeichnissen immer angepasst werden ==> das möchte ich umgehen

Daher habe ich mir überlegt, dass ich im jeweiligen Verzeichnis eine weitere Batch-Datei erstelle, welche den jeweiligen Pfad (%cd%) in eine Datei schreibt (z.B.: C:\Pfad.txt)
Allerdings muss meine Batch-Datei (die alles ausführen soll) als erstes diese (ich glaub die sog. "Kind-Bätche" *grübel*) ausführen, dann die Pfade aus der txt-Datei auslesen und den jeweils richtigen (aktuellen) Pfade übernehmen ==> Und hierbei komme ich nun nicht weiter, weil ich davon eigentlich keine Ahnung habe.
(Gut wäre vielleicht auch wenn ich ein Abfrage einbaue (set /p), so dass dann nicht jedesmal die Pfad-txt-Datei aktualisiert wird, sondern nur bei bedarf)

D.h., dass Auflisten und das erstellen der txt-Datei mit den Pfaden ist sowei kein Problem, nur eben:
1. Das Suchen der ganzen Batch-Dateien mit anschließendem starten dieser damit diese alles in eine txt-Datei schreiben
2. Dann das auslesen der einzelnen Pfade aus der txt-Datei
3. Dann das Übernehmen der richtigen Pfade
4. Und was ich vielleicht jetzt vergessen habe oder ich nicht weiss das ich es vergessen habe

Ansonsten habe aus einen ähnlichen Thread bisher nur folgendes gefunden (wobei ich nicht interpretieren kann, ob es das ist was mir weiterhelfen könnte, da ich mit diesem nicht viel anfgangen kann, sollte das weiterhelfen bin ich über eine erläuterung was dort passiert sehr dankbar!):

@echo off & Setlocal
for /r "c:\" %%i in (beispiel.exe?) do Set "pfad1=%%~dpi"
:: das müsste natürlich angepasst werden
:: Quelle: Mit Batch Datei Pfad suchen, diesen dann weiter verwenden

Wenn mir jemand weiter helfen könnte bin ich sehr dankbar! Ich bin auch für einen einfacheren Weg sehr dankbar!

Bei Lösungsvorschlägen wurde ich mich auch sehr über eine Erläuterung/Erklärung freuen, da ich das Ganze eben auch gern verstehen möchte, weil will ja dazulernen und nicht ständig um Rat fragen müssen face-smile

Schon mal Dank im Voraus!
ViRGiL

P.S.: System: Windows XP SP3

Content-Key: 108315

Url: https://administrator.de/contentid/108315

Printed on: April 24, 2024 at 12:04 o'clock

Member: bastla
bastla Feb 06, 2009 at 22:36:44 (UTC)
Goto Top
Hallo ViRGiL und willkommen im Forum!

Soferne ich das richtig verstanden habe, sollen die Pfade bestimmter Verzeichnisse immer aktuell in einer Textdatei aufscheinen.

Dafür sollte es genügen, in den jeweiligen Verzeichnissen zB eine Datei "Pfad.txt" (Inhalt egal) zu hinterlegen und bei Bedarf die Pfade all dieser Dateien zu ermitteln, zB
@echo off & setlocal
set "Liste=D:\Verzeichnisliste.txt"  
set "Datei=Pfad.txt"  
set "LW=D E F G"  

if exist "%Liste%" del "%Liste%"  
for %%i in (%LW%) do for /f %%a in ('dir /s /b /a-d "%%i:\%Datei%"') do >>"%Liste%" echo %%~dpa  
Zu pflegen wäre dann nur die Liste der Laufwerke (Zeile 4) ...

Grüße
bastla
Member: ViRGiL
ViRGiL Feb 06, 2009 at 23:18:36 (UTC)
Goto Top
Hallo bastla und hui schnelle reaktion face-wink

jab, soweit ist das richtig (sofern es keinen einfacheren Weg gibt), aber das ist nur die halbe Miete!

Das weit aus größte Problem für mich ist das auslesen dieser txt-Datei (Verzeichnisliste.txt), also das holen der jeweiligen Pfade in die ausführende Batch-Datei!!

Hab dein Script mal eben getestet und hui funktioniert 1a !! (Edit: ähm, ich habe die datei Pfad.txt nun mal von d:\Pfad.tct nach d:\aaa\Pfad.txt verschoben und schwups wird mir gesagt Datei nicht gefunden? *grübel* Edit2: ahh, vermutlich weil ich schon mehrere Laufwerke definiert habe aber nicht auf jedem Laufwerk die Datei war, kann man da noch was einbauen falls die datei eben nicht vorhanden ist, das er dies einfach überspringt?)

Dazu auch gleich mal Verständnisfragen,
Wofür steht bzw. was bedeuten:
setlocal
/a-d
%%~dpa
und warum kommen die Anführungszeichen bei:
set und den jeweiligen variablen hinzu (weil ich bisher immer ohne gearbeitet habe, da ich das noch gar nicht rausgefunden haben, wobei das wahrscheinlich der Grund dafür ist, dass bei mir auch bisher einiges nicht funktioniert hatte)

Grüße
ViRGiL
Member: Biber
Biber Feb 07, 2009 at 01:02:02 (UTC)
Goto Top
Moin ViRGiL,

willkommen im Forum.
Ich versuche mal, für @bastla ein paar der Antworten zu geben.

aber nicht auf jedem Laufwerk die Datei war, kann man da noch was einbauen falls die datei eben nicht vorhanden ist, das er dies einfach überspringt?)
Ja. Die Fehlermeldung "Datei nicht gefunden" lässt sich ins Nirwana umleiten. D.h. die Fehlermeldung wird zwar nach wie vor geschrieben, aber dorthin, wo auch die Garantie für meine Altersversorge niedergelegt ist.
Dazu (wie zu allen verwendeten Teil-Befehlen des Batches) TESTE TESTE TESTE am Cmd-Prompt:
>dir Gibtesnicht.txt /b
Datei nicht gefunden
>dir Gibtesnicht.txt /b 2>nul
-- keine Ausgabe--
Wofür steht bzw. was bedeuten:
setlocal
/a-d
%%~dpa
Beim Testen des DIR-Befehls kannst Du sowohl DIR /? ausprobieren wie auch den Unterschied zwischen "DIR /a:d" und "DIR /a:-d".
SetLocal erschließt sich Dir über SetLocal /?

Das %%~dpa erfährst Du unter "FOR /?" im letzten Drittel.
Kurzgefasst lässt es sich lesen als
  • von der Laufvariablen %%a der FOR-Anweisung will ich nur
  • den aus der Variablen (die einen vollständigen Dateinamen enthält)
  • abgeleiteten Wert d-wie-Drive und p-wie-path haben".
Sorry, lässt sich nicht kürzer ausdrücken... außer eben in diesen handlichen 6 Zeichen "%%~dpa"

und warum kommen die Anführungszeichen bei: set und den jeweiligen variablen hinzu
Um zu vermeiden, dass unabsichtlich Leerzeichen am Ende des zugewiesenen Werts mit in den Variableninhalt übernommen werden.
Ist allerdings kein Muss, sondern wird meines Wissens nur hier in diesem Forum kultiviert.
Profi-Scripte aus der Computerbild oder PC-Welt verkaufen sich auch ohne diesen Schnickschnack.

Führt alls in allem nur zu einer kosmetischen Anpassung an @sunblockers Schnipsel in der letzten Zeile.
@echo off & setlocal
set "Liste=D:\Verzeichnisliste.txt"  
set "Datei=Pfad.txt"  
set "LW=D E F G"  

if exist "%Liste%" del "%Liste%"  
for %%i in (%LW%) do for /f %%a in ('dir /s /b /a-d "%%i:\%Datei%" ^2^>nul') do >>"%Liste%" echo %%~dpa  

Zu guter Letzt:
Ich möchte per Batch-Datei bestimmte Verzeichnissen auf bestimmten Laufwerken (unterschiedliche Pfade) in einer Text-Datei auflisten

Wenn das der Ursprung aller Deiner Aktivitäten war, dann hilft es nix ..
  • bevor Du ganze Sätze sprichst, musst Du einzelne Worte lernen und verstehen
  • bevor Du einzelne CMD-Befehle in einem Batch zusammenkleistern kannst, musst Du die einzelnen Befehle wie Vokabeln lernen und verstehen.

Dazu, während der obige Schnipsel vor sich hin schrapelt:
  • noch ein Fenster öffnen mit "Start" -"Ausführen" -cmd
  • und in Ruhe nachlesen
Help
dir /?
set /?
for /?

Grüße
Biber
Member: ViRGiL
ViRGiL Feb 07, 2009 at 19:14:19 (UTC)
Goto Top
Hallo Biber,

ich habe das mal alles beherzigt und nachgelesen. Inzwischen verstehe ich sogar was da warum passiert face-smile

Deinen Tip habe ich inzwischen auch eingebaut und siehe da es funktioniert :-P

Nun habe ich mal etwas weiter recherchiert und gestet und recherchiert und getest ...
weil ich muss ja immernoch die Pfade aus der txt-Datei auslesen und ini die Batch übernehmen!!

... folgendes habe ich nun herausgefunden und ausprobiert

for /f "Skip=1 delims=;" %%a in (Verzeichnisliste.txt) do set "VerDatum=%%a"
echo %VerDatum%

echo Soll die VerzeichnisListe aktualisiert werden? (letzte Aktualisierung:%VerDatum%)

allerdings funktioniert das so gar nicht, d.h. es wird folgendes ausgegeben:

07.02.2009 - 18:12:27 Uhr
Echo ist ausgeschalten (OFF)
Echo ist ausgeschalten (OFF)
Soll die VerzeichnisListe aktualisiert werden? (letzte Aktualisierungface-smile

=> Echo ausgeschlaten, ist eigentlich klar, weil @ ECHO OFF am Anfang. Aber warum wird dann die letzte Zeile - bis auf die Variable - ausgegeben? Das heisst doch eigentlich nur, dass bereits beim setzen der Variable etwas schief gelaufen ist, oder?

Jedenfalls habe ich so gar keinen schimmer warum der Code nicht funktiert bzw. warum die Variable nicht gesetzt wird?

Die Hilfe, das Internet und das Forum haben mich irgendwie nicht weitergebracht, daher bin ich auch schon wieder hier. Ich befürchte auch noch, dass es etwas Banales sein wird *Asche auf mein Haupt*

Gruß
ViRGiL
Member: G4rfi3ld
G4rfi3ld Feb 07, 2009 at 19:24:45 (UTC)
Goto Top
hei ich will mich nicht gerade festlegen aber das problem hatte ich auch und ich habe nur die gänsefüschen am anfang von echo und am schluss vergessen
das heist
"echo" ist nicht gleich echo  
mit dem zeichen echo ohne ( " ) wird nur der echo status abgefragt.

oder bin ich falsch

MFG g4rFi3ld der batch newbie
Member: bastla
bastla Feb 07, 2009 at 19:45:09 (UTC)
Goto Top
@G4rfi3ld
die gänsefüschen am anfang von echo
sind selten überhaupt und hier schon gar nicht das Thema (da "echo" als Befehl und nicht als Text verwendet wird)...

@ViRGiL
Das heisst doch eigentlich nur, dass bereits beim setzen der Variable etwas schief gelaufen ist, oder?
Richtig erkannt - eine Ausgabe
Echo ist ausgeschalten (OFF)
erhältst Du, wenn die auszugebende Variable leer ist - warum sie das ist, lässt sich ohne die "Verzeichnisliste.txt" gesehen zu haben, schwer sagen ...

Grüße
bastla
Member: ViRGiL
ViRGiL Feb 07, 2009 at 20:12:47 (UTC)
Goto Top
Hui, na wenigstens kann ich inzwischen schon mit einigen dingen entwas anfangen auch wenn ich noch nicht immer gleich weiss wie ich das ein oder andere Problem selbst beheben kann :-P

ind der Verzeichnisliste.txt steht bisher nur folgendes:

1: Verzeichnisliste aktualisiert am:
2: 07.02.2009 - 18:12:27 Uhr;
3:
4:

da ich die pseudo txt-Dateien (Pfad.txt) wieder gelöscht habe!

ViRGiL
Member: bastla
bastla Feb 07, 2009 at 20:36:20 (UTC)
Goto Top
Hallo ViRGiL!

Die Leerzeilen 3 und 4 könnten natürlich als Erklärung für die beschriebene Ausgabe dienen, allerdings nicht mit dem geposteten Code
for /f "Skip=1 delims=;" %%a in (Verzeichnisliste.txt) do set "VerDatum=%%a"  
echo %VerDatum%
da hier die Leerzeilen einfach übersprungen würden - insofern bitte auch den aktuellen Stand des Batches nochmals posten ...

Grüße
bastla

P.S.: Apropos "geposteter Code": Dafür hätten wir (in der "plain"-Variante auch gut, um einen Dateiinhalt oder eine Ausgabe darzustellen) ...
Member: ViRGiL
ViRGiL Feb 07, 2009 at 21:06:05 (UTC)
Goto Top
Okay, wird germacht:

Batch (Auszug: Das ist derzeit alles was ausgeführt wird, und steht in der Batch natürlich direkt am Anfang, zuvor kommen nur ein paar echo-Befehle, welche denk ich hier eh keine Rolle spielen dienen nur dem Layout)

:: Testbeginn
set "Liste=E:\[Zone_E]\Listen\Verzeichnisliste.txt" 
set "Datei=Pfad.txt" 
set "LW=C D E G H I J" 
	
for  /f  "Skip=1 delims=;" %%a in (Verzeichnisliste.txt) do set "VerDatum=%%a"
echo %VerDatum%
		
echo Soll die VerzeichnisListe aktualisiert werden? (letzte Aktualisierung:%VerDatum%)
Pause
goto end
:: Testende

wobei die txt-Verzeichnisliste.txt derzeit im Ordern der Batch-Datei liegt

Inhalt Verzeichnisliste.txt (wie o.a.)
1: Verzeichnisliste aktualisiert am:
2: 07.02.2009 - 18:12:27 Uhr;
3:
4:

Und die Ausgabe dann (Damit haben wir's komplett):
07.02.2009 - 18:12:27 Uhr
Echo ist ausgeschalten (OFF)
Echo ist ausgeschalten (OFF)
Soll die VerzeichnisListe aktualisiert werden? (letzte Aktualisierung: )

Ahh, jetzt wo ich es sehe, könnte es tatsächlich so sein, dass eben Zeile 2 - 4 aus Verzeichnisliste.txt ausgelesen wird, was dann wohl nciht in die Variable übergeben werden kann? Denn dann wären wir ohne hin bei dem Problem, dass ich bis jetzt noch nicht herausgefunden habe wie ich mich eben nur auf die Zeiel 2 beschränken kann, denn mit "Skip=1" überspringe ich doch nur die Zeile 1, allerdings dachte ich, dass mit "delims=;" auch nur bis zum ";" hinter Uhr alles (also nur Zeile 2) ausgelesen wird!?

ViRGiL
Member: bastla
bastla Feb 07, 2009 at 21:31:33 (UTC)
Goto Top
Hallo ViRGiL!

Sorry - hatte (weil ich "1:" bis "4:" für nur für das Posten hinzugefügte Zeilennummern gehalten hatte) angenommen, die Zeilen 3 und 4 wären ganz leer ...

Wenn diese Nummerierung tatsächlich in der Datei enthalten ist, müsste allerdings %VerDatum% den Inhalt "4:" haben, da bei jedem Schleifendurchlauf der Wert der Variablen überschrieben wird und somit der letzte gelesene Wert nach der Schleife in %VerDatum% steht ...

Seltsam ist, dass, da ja die "echo"-Zeile erst nach der Schleife folgt, eigentlich nur eine Zeile ausgegeben werden dürfte - eben mit dem Inhalt "4:"

Ändere zum Testen das "echo off" am Anfang in ein "echo on" - damit wird dann jeder Befehl vor der Ausführung angezeigt und es sollte sich so leichter erkennen lassen, wo es noch knirscht ...
Noch etwas: Es könnte sein, dass eine falsche "Verzeichnisliste.txt" verwendet wird, da Du zwar einen Pfad in %Liste% festlegst, diesen jedoch dann nicht verwendest - die entsprechende Zeile (und für das Posten von Batches solltest Du nur < code>, ohne "plain" verwenden, da durch die dann angezeigten Zeilennummern leichter auf eine bestimmte Zeile verwiesen werden kann) sollte eher so aussehen:
for  /f  "usebackq Skip=1 delims=;" %%a in ("%Liste%") do set "VerDatum=%%a"
Das "usebackq" erlaubt es, um den in %Liste% enthaltenen Dateipfad herum Anführungszeichen zu setzen (falls dieser einmal Leerzeichen enthalten sollte) - anderenfalls würde "for /f" den Pfad als zu zerlegenden Text und nicht als Verweis auf eine Datei interpretieren.

Grüße
bastla

[Edit] Hatte Deine Ergänzung vorhin noch nicht gesehen - wenn Du nur die Zeile 2 auslesen willst, dann so:
set VerDatum=
for  /f  "usebackq Skip=1 delims=;" %%a in ("%Liste%") do if not defined VerDatum set "VerDatum=%%a"  
Nur bei der Zeile 2 (Zeile 1 wird ja übersprungen) - falls diese ein Datum enthält - ist die Variable %VerDatum% noch nicht gesetzt und bekommt daher einen Wert zugewiesen - für alle folgenden Zeile ist diese Bedingung dann nicht erfüllt und der Wert in %VerDatum% wird daher nicht mehr verändert.
[/Edit]
Member: ViRGiL
ViRGiL Feb 07, 2009 at 21:54:42 (UTC)
Goto Top
Ups, da haben wir uns gerade ein wenig missverstanden, wahrscheinlich mein Fehler, die Zalen in der TXT sollen tatsächlich nur die Zeilennummern darstellen! Sorry, bin doch neu hier :-P

Aber ich werde jetzt mal deinen Beitrag durch gehen!!

Wollt nur schon mal vorab, das Missverständnis aufklären, falls die Lösung dadurch anders aussehen sollte!

Edit:
So also, in der Tat hat eigentlich nur das "usebackq" gefehlt, mal abgesehen von dem "do if not defined VerDatum" *fg*

Wenn ich mir die Hilfe zu diesem "usebackq" so ansehe frage ich mich gerade, ob ich jemals darauf gekommen wäre, na ja!

Lange Rede kurzer Sinn, jetzt funktioniert alles und ich kann den Rest der Batch hoffentlich ohne größere Probleme fertig stellen, soll heissen gelöst wurden:

1. Das Suchen verschiedener Pfade (hier auf den Laufwerken D:\ E:\ G:\) durch Auffinden bestimmer Dateien (hier Pfad.txt) mit anschließender Auflistung in einer txt-Datei (hier Verzeichnisliste.txt)
@echo off & setlocal 

set "Liste=E:\[Zone_E]\Listen\Verzeichnisliste.txt" 
set "Datei=Pfad.txt" 
set "LW=D E G" 

if exist "%Liste%" del "%Liste%" 

for %%i in (%LW%) do for /f %%a in ('dir /s /b /a-d "%%i:\%Datei%"') do >>"%Liste%" echo %%~dpa

2. Das Auslesen bestimmter Zeilen aus dieser Datei (Verzeichnisliste) mit dem anschließenden Übergeben in eine Variable (hier VerDatum) zur weiterverwendung dieser Zeile
Set VerDatum=
for /f  "usebackq Skip=1 delims=;" %%a in ("%Liste%")do if not defined VerDatum set "VerDatum=%%a"

So ich habe das Gröbste mal zusammengefasst, mich ärgert es nämlich immer, wenn Threads gelöst wurden, aber manchmal trotzdem alles irgendwie undurchsichtig bleibt, weil der Ersteller dann einfach nur auf den richtigen Weg geführt wurde, sich selber nicht mehr meldet und die Suchenden dann irgendwie auf der Strecke bleiben, weil der Thread ansich so lang und undurchsichtig wirkt.

An dieser Stelle, besten Dank!!
Ich glaub ich erscheine jetzt öfter hier face-smile Mir fallen bestimmt noch mehr fragen ein *fg*

Gruß
ViRGiL
Member: ViRGiL
ViRGiL Feb 08, 2009 at 23:20:56 (UTC)
Goto Top
Hallo,

ich schreibe einfach nochmal in diesen Thread, weils eigentlich dazugehört

Ähm, ich bereits ein ganzes Stück weiter gekommen, d.h. ich bereits beim durchsuchen der Verzeichnisse, mit folgender Codezeile:

for /F "tokens=6,7,8,9* delims=\" %%A in ('dir %LWDD%*. /s /b') do >> %TXT% echo ...\%%A\%%B\%%C\%%D

Das funktioniert so weit bis auf die Tatsache, dass er mir nun alle Verzeichnisse die einen Punkt enthalten nicht auflistet!? Ich vermute mal ich müsste mit for /R arbeiten oder? Doch dann bekomme ich wieder ein Problem mit der Verzeichnissliste, welche die Pfade zu den Verzeichnissen (s.o.) enthält!

Anmerkung "tokens=..." deshalb, weil ich den Pfad zu den Verzeichnissen als Überschrift verwende.

Gruß
ViRGiL
Member: bastla
bastla Feb 11, 2009 at 18:14:26 (UTC)
Goto Top
Hallo ViRGiL!

Wenn Du nur Verzeichnisse auflisten willst, dann "dir /ad" - daher:
for /F "tokens=6,7,8,9* delims=\" %%A in ('dir "%LWDD%*.*" /s /b /ad') do >> %TXT% echo ...\%%A\%%B\%%C\%%D
Grüße
bastla

P.S.: Vielen Dank für Deine Zusammenfassung. face-smile
Member: ViRGiL
ViRGiL Feb 13, 2009 at 20:54:37 (UTC)
Goto Top
Hallo bastla,

jup, das mit dem /ad ist mir auch schon in den Sinn gekommen :-P

wobai ich aus dem /ad ein /A:d gemacht habe, macht dass eigentlich einen unterschied.

Ansonsten bin ich immer noch bei der gleichen Batch und stecke auch spontan wieder fest, aber ist wohl einer neuer Threat, weils nur indirekt mit diesem zu tun hat *g*

Gruß
ViRGiL
Member: bastla
bastla Feb 13, 2009 at 20:57:56 (UTC)
Goto Top
Hallo ViRGiL!
wobai ich aus dem /ad ein /A:d gemacht habe, macht dass eigentlich einen unterschied.
Kein Unterschied - "/ad" ist nur etwas kürzer ... face-wink

Grüße
bastla