Batch ordner auslesen in variable (und zeilen nummerieren)
Guten Abend, nach langer Zeit wieder einmal ein Problem Trotz intensiver Suche gelang mir noch keine Lösung ...
1. Die Dateien eines Ordners (ohne viele weitere Infos, nur der Dateiname) sollen ausgelesen werden und als variable gespeichert werden:
FOR /F "usebackq delims=" %%i in (`dir /a/b .\config\*.*`) do set VARIABLE=%%i
type "%variable%"
pause
Dieses Vorhaben ist mir bisher nicht gelungen..
2. Als Variante möchte ich gerne die Auflistung jeweils mit einer Zeilennummer versehen, da die jeweilige Datei später ausgewählt werden können soll. Es geht um die Auflistung von Sicherheitskopien. Wenn ich dann z.B. 3. eingebe, soll die 3. Kopie wieder eingespielt werden.
OKIDOKI
1. Die Dateien eines Ordners (ohne viele weitere Infos, nur der Dateiname) sollen ausgelesen werden und als variable gespeichert werden:
FOR /F "usebackq delims=" %%i in (`dir /a/b .\config\*.*`) do set VARIABLE=%%i
type "%variable%"
pause
Dieses Vorhaben ist mir bisher nicht gelungen..
2. Als Variante möchte ich gerne die Auflistung jeweils mit einer Zeilennummer versehen, da die jeweilige Datei später ausgewählt werden können soll. Es geht um die Auflistung von Sicherheitskopien. Wenn ich dann z.B. 3. eingebe, soll die 3. Kopie wieder eingespielt werden.
OKIDOKI
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 28.02.2012 um 13:32:15 Uhr
Verschoben von "Tools & Utilities" nach "Batch & Shell"
Content-ID: 181153
Url: https://administrator.de/contentid/181153
Ausgedruckt am: 19.11.2024 um 17:11 Uhr
31 Kommentare
Neuester Kommentar
Hallo OKIDOKI!
Errinnert mich an diese Fragestellung ...
... wobei aber das Abspeichern in Variablen eigentlich gar nicht nötig sein sollte - ungetestet etwa so:
Grüße
bastla
[Edit] Zeile 15 korrigiert [/Edit]
Errinnert mich an diese Fragestellung ...
... wobei aber das Abspeichern in Variablen eigentlich gar nicht nötig sein sollte - ungetestet etwa so:
::ggf mehr Platz für die Anzeige schaffen
::mode con lines=50
set /a Max=0
for /f "tokens=1* delims=:" %%i in ('dir /a/b config^|findstr /n .') do echo (%%i) %%j & set /a Max=%%i
If %Max%==0 echo Keine Dateien gefunden! & goto :eof
echo\
:Eingabe
set "Nr="
set /p Nr=Bitte Nummer der Sicherung angeben:
if not defined Nr goto :Eingabe
set "Sich="
for /f "tokens=1* delims=:" %%i in ('dir /a/b config^|findstr /n .^|findstr /b "%Nr%:"') do set "Sich=%%j"
if defined Sich goto :DoIt
set "Auswahl="
set /p Auswahl=Auswahl nicht korrekt - nochmals versuchen (J/N)?
if /i "%Auswahl%"=="j" goto :Eingabe
goto :eof
:DoIt
echo "%Sich%" wurde gewaehlt ...
Grüße
bastla
[Edit] Zeile 15 korrigiert [/Edit]
Hallo OKIDOKI,
Naja, 5 Tage sind jetzt mal nicht so lang imho ==> Batch Timeout in msgbox anzeigen?
Mit keiner. Bastla gibt die Dateien aus, ohne sie zu speichern. Nach der Auswahl wird die gewünschte Datei neu ermittelt und über die Variable "Sich" ausgegeben. Er hat es ja auch geschrieben:
Risiko bei diesem Vorgehen: Verändert sich der Inhalt des Ordners "config" zwischen der Anzeige und dem ermitteln der ausgewählten Datei wird die falsche Datei in die Variable "Sich" geschrieben.
Geht man allerdings von einem stabilen Umfeld aus lässt sich mit dem Skript Dein Primärziel erreichen. Solltes Du dennoch Wert darauf legen eine Dateiliste zu speichern könntest Du unter Verwendung von Bastla's erstem for auch zusätzlich jede Datei in dynamisch generierte Variablen schreiben und nach der Auswahl einfach die entsprechende Variable verwenden.
Gruß icsAT
Naja, 5 Tage sind jetzt mal nicht so lang imho ==> Batch Timeout in msgbox anzeigen?
Zitat von @OKIDOKI:
PS: Wie wird die Dateiliste untereinander (alle Dateien untereinander aufgelistet) angezeigt?
Es gibt keine "Dateiliste". Die Ausgabe erfolgt zeilenweise durchPS: Wie wird die Dateiliste untereinander (alle Dateien untereinander aufgelistet) angezeigt?
echo (%%i) %%j
Mit keiner. Bastla gibt die Dateien aus, ohne sie zu speichern. Nach der Auswahl wird die gewünschte Datei neu ermittelt und über die Variable "Sich" ausgegeben. Er hat es ja auch geschrieben:
Zitat von @bastla:
... wobei aber das Abspeichern in Variablen eigentlich gar nicht nötig sein sollte - ungetestet etwa so:
... wobei aber das Abspeichern in Variablen eigentlich gar nicht nötig sein sollte - ungetestet etwa so:
Risiko bei diesem Vorgehen: Verändert sich der Inhalt des Ordners "config" zwischen der Anzeige und dem ermitteln der ausgewählten Datei wird die falsche Datei in die Variable "Sich" geschrieben.
Geht man allerdings von einem stabilen Umfeld aus lässt sich mit dem Skript Dein Primärziel erreichen. Solltes Du dennoch Wert darauf legen eine Dateiliste zu speichern könntest Du unter Verwendung von Bastla's erstem for auch zusätzlich jede Datei in dynamisch generierte Variablen schreiben und nach der Auswahl einfach die entsprechende Variable verwenden.
Gruß icsAT
Hallo OKIDOKI,
Evtl. könntest Du auch eine ggf. vorhandene "liste.txt" noch löschen, bevor Du eine neue erstellst.
Und Du könntes natürlich auch ein
direkt an das "%%j" hängen und ungefähr ab Zeile 7 alles löschen.
Gruß icsAT
Zitat von @OKIDOKI:
Hintergrund mit der Variablen war die Überlegung, die Dateiliste (liste.txt oder Variabel) nicht in der Dosbox zu haben,
sondern in folgendem poup.
Anschließend würde ich gerne die Datei auswählen und damit dann weiterarbeiten:
Warum schreibst Du dass denn nicht in Deiner Frage???Hintergrund mit der Variablen war die Überlegung, die Dateiliste (liste.txt oder Variabel) nicht in der Dosbox zu haben,
sondern in folgendem poup.
Anschließend würde ich gerne die Datei auswählen und damit dann weiterarbeiten:
Zitat von @OKIDOKI:
Bei der jetzigen VAriante gibt er bei jeder Datei den Pfad mit aus und dahinter: echo (3) test.zip & set /a Max=3 Das ist natürlich sehr unübersichtlich
Wie kommst Du darauf? Der Parameter "/b" im "dir" sollte die Pfadausgabe verhindern und für mich sieht es eher so aus, als würde die Dateinummer in Klammern und der Dateiname ohne Pfad ausgegeben werden. Im Anschluss wird die Variable "Max" auf die Dateinummer gesetzt, damit nach dem "For" geprüft werden kann, ob überhaupt Dateien gefunden wurden.Bei der jetzigen VAriante gibt er bei jeder Datei den Pfad mit aus und dahinter: echo (3) test.zip & set /a Max=3 Das ist natürlich sehr unübersichtlich
Zitat von @OKIDOKI:
Leider gibt es keine Liste - du schreibst es wäre möglich, vielleicht so ungefähr: &&>liste.txt echo %i%
%j% Da wird aber leider nichts in die Datei geschrieben ;-(
Naja, so ungefähr. Du solltest allerdings ungefähr ">>" statt ">" und "%%i" und "%%j" statt "%i%" und "%j" verwenden.Leider gibt es keine Liste - du schreibst es wäre möglich, vielleicht so ungefähr: &&>liste.txt echo %i%
%j% Da wird aber leider nichts in die Datei geschrieben ;-(
Evtl. könntest Du auch eine ggf. vorhandene "liste.txt" noch löschen, bevor Du eine neue erstellst.
Und Du könntes natürlich auch ein
>>liste.txt
Gruß icsAT
Hallo Bastla,
ich glaube ich muss OKIDOKI bezüglich der Zeile 1 und des Aufrufes gerade mal in Schutz nehmen,
Gruß icsAT
ich glaube ich muss OKIDOKI bezüglich der Zeile 1 und des Aufrufes gerade mal in Schutz nehmen,
Zitat von @OKIDOKI:
Bei der jetzigen VAriante gibt er bei jeder Datei den Pfad mit aus und dahinter: echo (3) test.zip & set /a Max=3 Das ist natürlich sehr unübersichtlich, daher die Frage, wie es als Liste aller Datei
denn dass sieht mir genau nach dem Gegenteil von dem aus, was Du vermutest. Oder vermutest Du das gleiche wie ich und ich habe Deinen Kommentar nur nicht verstanden??? *confused*Bei der jetzigen VAriante gibt er bei jeder Datei den Pfad mit aus und dahinter: echo (3) test.zip & set /a Max=3 Das ist natürlich sehr unübersichtlich, daher die Frage, wie es als Liste aller Datei
Gruß icsAT
Hallo OKIDOKI,
es tut mir wirklich Leid aber ich kann in Deinem letzten Betrag keine einzige Fragestellung finden. Tschuldigung eine:
Und ich befürchte ich kann das nur mit "NEIN" beantworten.
Selbstverständlich habe ich zwischenzeitlich Dein Vorhaben verstanden aber leider schreibst Du mit keinem Wort, wo Du jetzt noch ein Problem hast.
Bastlas Vorschlag erfüllt Deinen Zweck ohne Verwendung von VBS.
Welches Problem hast Du mit der Ausgabeliste, diese brauchst Du bei Bastla's Variante nicht.
Solltest Du unbedingt vbs haben wollen, hat Bastla Dir bereits den Hinweis gegeben eventuell über eine InputBox nachzudenken, was ich für nicht ganz unberechtigt halte. Und ich habe Dir bereits aufgezeigt, wie Du aus Bastla's Batch eine "liste.txt" zauberst.
Sorry, ich kann hier wirklich kein zur Fragestellung passendes Problem erkennen.
Gruß icsAT
es tut mir wirklich Leid aber ich kann in Deinem letzten Betrag keine einzige Fragestellung finden. Tschuldigung eine:
Und ich befürchte ich kann das nur mit "NEIN" beantworten.
Selbstverständlich habe ich zwischenzeitlich Dein Vorhaben verstanden aber leider schreibst Du mit keinem Wort, wo Du jetzt noch ein Problem hast.
Bastlas Vorschlag erfüllt Deinen Zweck ohne Verwendung von VBS.
Zitat von @OKIDOKI:
Dies stellte sich dann als schwieriger heraus als gedacht, weil bastla diesen Supervorschlag mit ohne vorhandener Variabel machte. Finde ich natürlich sehr viel besser face-smile aber dann trat für wieder das Problem mit der Ausgabeliste aus und damit verbundenen Abfrage ebenfalls in einer msgbox auf ...
"mit ohne vorhandener Variable" stimmt ja nicht, die ausgewählte Datei steht in "%Sich%", welche Bastla ja auch mit einem "echo" ausgibt.Dies stellte sich dann als schwieriger heraus als gedacht, weil bastla diesen Supervorschlag mit ohne vorhandener Variabel machte. Finde ich natürlich sehr viel besser face-smile aber dann trat für wieder das Problem mit der Ausgabeliste aus und damit verbundenen Abfrage ebenfalls in einer msgbox auf ...
Welches Problem hast Du mit der Ausgabeliste, diese brauchst Du bei Bastla's Variante nicht.
Solltest Du unbedingt vbs haben wollen, hat Bastla Dir bereits den Hinweis gegeben eventuell über eine InputBox nachzudenken, was ich für nicht ganz unberechtigt halte. Und ich habe Dir bereits aufgezeigt, wie Du aus Bastla's Batch eine "liste.txt" zauberst.
Sorry, ich kann hier wirklich kein zur Fragestellung passendes Problem erkennen.
Gruß icsAT
Hallo icsAT!
Ich nehme mal an, OKIDOKI wollte etwas in der Art (und nein, schöner mach ich das nicht ):
Noch als Begründung, warum "
Grüße
bastla
Ich nehme mal an, OKIDOKI wollte etwas in der Art (und nein, schöner mach ich das nicht ):
@echo off & setlocal
set "Ordner=config"
set "Liste=%temp%\Liste.txt
set "Input=%temp%\Input.vbs"
dir /a/b/od "%Ordner%"|findstr /n . >"%Liste%"
>%Input% echo L=Split(CreateObject("Scripting.FileSystemObject").OpenTextFile("%Liste%").ReadAll,vbCrLf):Max=UBound(L)
>>%Input% echo Do:Ein=InputBox(Join(L,vbCrLf),"Auswahl durch Eingabe der Nummer"):If Not IsNumeric(Ein) Then Ein=0:End If:Loop Until CInt(Ein)^<=Max:WScript.Echo CInt(Ein)
for /f %%i in ('cscript //nologo %Input%') do set "Nr=%%i"
if %Nr%==0 echo Keine Datei gewaehlt! & goto :eof
for /f "tokens=1* delims=:" %%i in ('findstr /b "%Nr%:" %Liste%') do set "Sich=%%j"
if not defined Sich echo Datei Nr %Nr% nicht gefunden! & goto :eof
del %Liste%
del %Input%
echo "%Sich%" wurde gewaehlt ...
Noch als Begründung, warum "
Max=UBound(L)
" und nicht "Max=UBound(L)+1
": Die Textdatei endet mit einer Zeilenschaltung, wodurch sich für VBS eine Zeile mehr ergibt - diese (Leerzeile) soll aber natürlich nicht gewählt werden können ...Grüße
bastla
Hallo OKIDOKI!
Grüße
bastla
Aber mit welcher Sprungmarke arbeite ich dann weiter?
Um mich selbst zu zitieren:indem Du die Vorgangsweise der Zeilen 4 bis 6 von [Edit] ganz [/Edit] oben übernimmst
Grüße
bastla
Hallo OKIDOKI!
Ich hatte eigentlich gehofft, Du würdest verstanden haben, was die Zeilen 4-6 machen, bzw, dass für die VBS-Variante natürlich die neue Zeile 5 zuständig ist ...
Grüße
bastla
Ich hatte eigentlich gehofft, Du würdest verstanden haben, was die Zeilen 4-6 machen, bzw, dass für die VBS-Variante natürlich die neue Zeile 5 zuständig ist ...
Grüße
bastla
Hallo OKIDOKI!
Vielleicht so:
Achtung - bei der Suche in Zeile 17 muss die Darstellungsform (derzeit
also mit Leerzeichen vor und nach dem ":") im Suchbegriff und als zusätzlicher Delimiter (Leerzeichen) berücksichtigt werden!
Grüße
bastla
Vielleicht so:
@echo off & setlocal
set "Ordner=config"
if not exist "%Ordner%" goto :nichtda
dir /b/a-d "%Ordner%">nul 2>nul || goto :leer
set "Liste=%temp%\Liste.txt
set "Input=%temp%\Input.vbs"
del "%Liste%" 2>nul
for /f "tokens=1* delims=:" %%i in ('dir /b/a-d/od "%Ordner%"^|findstr /n .') do >>"%Liste%" echo %%i : %%j
>%Input% echo L=Split(CreateObject("Scripting.FileSystemObject").OpenTextFile("%Liste%").ReadAll,vbCrLf):Max=UBound(L)
>>%Input% echo Do:Ein=InputBox(Join(L,vbCrLf),"Auswahl durch Eingabe der Nummer"):If Not IsNumeric(Ein) Then Ein=0:End If:Loop Until CInt(Ein)^<=Max:WScript.Echo CInt(Ein)
for /f %%i in ('cscript //nologo %Input%') do set "Nr=%%i"
if %Nr%==0 echo Keine Datei gewaehlt! & goto :eof
for /f "tokens=1* delims=: " %%i in ('findstr /b /c:"%Nr% :" %Liste%') do set "Sich=%%j"
if not defined Sich echo Datei Nr %Nr% nicht gefunden! & goto :eof
del %Liste%
del %Input%
echo "%Sich%" wurde gewaehlt ...
::
:: was so zu tun ist mit "%Sich%"
::
goto :eof
:nichtda
echo Ordner "%Ordner%" nicht gefunden
pause
goto :eof
:leer
echo leer
pause
goto :eof
Nr : Dateiname
Grüße
bastla
Hallo OKIDOKI!
Für das Suchen ist ja nur das Leerzeichen vor dem ":" von Bedeutung (Du kannst aber auch das darauf folgende mit aufnehmen); als Delimiter benötigst Du das Leerzeichen, damit nicht der Dateiname mit führendem Leerzeichen in die Variable gesetzt wird - Erklärung: Da unmittelbar aufeinander folgende Delimiter in Batch nur als ein Trennzeichen gelsten, wird bei der Zerlegung aus der gefundenen Zeile die Nr in %%i geschrieben, " : " als Trennzeichen entfernt und dann der Dateiname in %%j übernommen; würdest Du den Delimiter "Leerzeichen" weglassen, würde Nr + Leerzeichen vor dem (dann einzigen Trennzeichen) ":" in %%i stehen und Leerzeichen + Dateiname in %%j ...
Alternativ könntest Du zB auch folgende beiden Zeilen verwenden:
und
Grüße
bastla
Für das Suchen ist ja nur das Leerzeichen vor dem ":" von Bedeutung (Du kannst aber auch das darauf folgende mit aufnehmen); als Delimiter benötigst Du das Leerzeichen, damit nicht der Dateiname mit führendem Leerzeichen in die Variable gesetzt wird - Erklärung: Da unmittelbar aufeinander folgende Delimiter in Batch nur als ein Trennzeichen gelsten, wird bei der Zerlegung aus der gefundenen Zeile die Nr in %%i geschrieben, " : " als Trennzeichen entfernt und dann der Dateiname in %%j übernommen; würdest Du den Delimiter "Leerzeichen" weglassen, würde Nr + Leerzeichen vor dem (dann einzigen Trennzeichen) ":" in %%i stehen und Leerzeichen + Dateiname in %%j ...
Alternativ könntest Du zB auch folgende beiden Zeilen verwenden:
for /f "tokens=1* delims=:" %%i in ('dir /b/a-d/od "%Ordner%"^|findstr /n .') do >>"%Liste%" echo %%i__%%j
for /f "tokens=1* delims=_" %%i in ('findstr /b /c:"%Nr%_" %Liste%') do set "Sich=%%j"
bastla
[OT]
Hmm, ob das Pferd sich wohl so euphorisch bedankt hat?
Böse Zungen würden behaupten, das weiße Pferd war ein Rappe, der erst kalkweiß geworden ist, als bastla aufsteigen wollte...
Gut, dass hier im Forum böse Zungen eher selten sind ...
SCNR
Biber
[/OT]
Hmm, ob das Pferd sich wohl so euphorisch bedankt hat?
Böse Zungen würden behaupten, das weiße Pferd war ein Rappe, der erst kalkweiß geworden ist, als bastla aufsteigen wollte...
Gut, dass hier im Forum böse Zungen eher selten sind ...
SCNR
Biber
[/OT]
Hallo OKIDOKI!
... aber falls Du das so haben wolltest (meine Überlegung war, dass es sich dabei einfach um einen Eingabefehler handelt und es daher eine weitere Chance geben sollte - ein Abbruch ist ja ohnehin immer möglich), wäre die Zeile 12 auf
zu ändern ...
Grüße
bastla
Allerdings könnte "ich betone könnte" er bei "größer als Dateianzahl" auch dieselbe Meldung auswerfen wie bei einer 0, also "keine Datei gewählt!".
Nicht, wenn mein Code das tut, was er soll ... ... aber falls Du das so haben wolltest (meine Überlegung war, dass es sich dabei einfach um einen Eingabefehler handelt und es daher eine weitere Chance geben sollte - ein Abbruch ist ja ohnehin immer möglich), wäre die Zeile 12 auf
>>%Input% echo Ein=InputBox(Join(L,vbCrLf),"Auswahl durch Eingabe der Nummer"):If Not IsNumeric(Ein) Then Ein=0:End If:If CInt(Ein)^>Max Then Ein=0:End If:WScript.Echo CInt(Ein)
Grüße
bastla