okidoki
Goto Top

Batch ordner auslesen in variable (und zeilen nummerieren)

Guten Abend, nach langer Zeit wieder einmal ein Problem face-wink 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
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

bastla
bastla 28.02.2012, aktualisiert am 18.10.2012 um 18:50:09 Uhr
Goto Top
Hallo OKIDOKI!

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]
OKIDOKI
OKIDOKI 28.02.2012 um 12:49:35 Uhr
Goto Top
Hallo bastla,

die andere Fragestellung ist wirklich ähnlich!

Bei deinem Batch werden alle Dateien angezeigt, ein Auswahl kommt aber nicht. ;-(
Stattdessen erscheint die Meldung "if 0 == 0 echo Keine Dateien gefunden! & goto :eof " und er steigt aus dem batch aus ...

Wahrscheinlich komisch die Frage, aber hast du dazu eine Idee? face-wink

Gruß OKIDOKI
bastla
bastla 28.02.2012 um 13:03:38 Uhr
Goto Top
Hallo OKIDOKI!
hast du dazu eine Idee?
Naja, ich könnte ganz einfach die Zeile 15 korrigieren ... face-wink

Grüße
bastla
OKIDOKI
OKIDOKI 28.02.2012 um 13:15:42 Uhr
Goto Top
Hallo bastla,

das wäre schön ...

do set "Sich=%%j" = i

PS: Wie wird die Dateiliste untereinander (alle Dateien untereinander aufgelistet) angezeigt?
PS1: Mit welcher Variablen, die die Dateiliste enthält, kann ich weiterarbeiten?

Grüße
OKIDOKI
icsat
icsat 28.02.2012 um 14:32:09 Uhr
Goto Top
Hallo OKIDOKI,

Zitat von @OKIDOKI:
... nach langer Zeit wieder einmal ein Problem ...
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 durch
echo (%%i) %%j

Zitat von @OKIDOKI:
PS1: Mit welcher Variablen, die die Dateiliste enthält, kann ich weiterarbeiten?
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:

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
OKIDOKI
OKIDOKI 28.02.2012 um 16:06:47 Uhr
Goto Top
Hallo icsAT,

> Zitat von @OKIDOKI:
> ... nach langer Zeit wieder einmal ein Problem ...
Naja, 5 Tage sind jetzt mal nicht so lang imho ==> Batch Timeout in msgbox anzeigen?

Das war eher ein lauwarmer Scherz face-wink

> Zitat von @OKIDOKI:
> PS: Wie wird die Dateiliste untereinander (alle Dateien untereinander aufgelistet) angezeigt?
Es gibt keine "Dateiliste". Die Ausgabe erfolgt zeilenweise durch
echo (%%i) %%j

> Zitat von @OKIDOKI:
> PS1: Mit welcher Variablen, die die Dateiliste enthält, kann ich weiterarbeiten?
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:

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 ;-(
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 untereinander funktioniert ...

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.

In diesem Fall ist von einem stabilen Umfeld auszugehen. Problem wie oben versucht, einen Ansatz zu finden.

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:

>>"%temp%\msgbox.vbs" ECHO sInfoText = "liste.txt"   
>>"%temp%\msgbox.vbs" ECHO sTitel = "Übersicht"   
>>"%temp%\msgbox.vbs" ECHO iSek = 15 'Anzeigedauer in Sekunden   
>>"%temp%\msgbox.vbs" ECHO Set WshShell = WScript.CreateObject("WScript.Shell")   
>>"%temp%\msgbox.vbs" ECHO Set fso = CreateObject("Scripting.FileSystemObject")   
>>"%temp%\msgbox.vbs" ECHO sText = fso.OpenTextFile(sInfoText, 1).ReadAll   
>>"%temp%\msgbox.vbs" ECHO WshShell.Popup sText, iSek, sTitel, vbInformation  
"%temp%\msgbox.vbs"  
DEL "%temp%\msgbox.vbs"  

OKIDOKI: Code angepasst!

PS: Auch wenn die Popup-Geschichte nicht jedem gefällt face-wink

Gruß OKIDOKI
icsat
icsat 28.02.2012 um 16:40:19 Uhr
Goto Top
Hallo OKIDOKI,

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???

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.

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.
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
direkt an das "%%j" hängen und ungefähr ab Zeile 7 alles löschen.


Gruß icsAT
bastla
bastla 28.02.2012 um 17:29:04 Uhr
Goto Top
Hallo OKIDOKI!

Nach der Zeile 1 frage ich gleich gar nicht (und nach dem "CALL" auch nicht), aber warum ein PopUp und keine InputBox, wenn Du doch eine Eingabe haben willst?

Grüße
bastla
icsat
icsat 28.02.2012 um 18:30:50 Uhr
Goto Top
Hallo Bastla,

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*


Gruß icsAT
bastla
bastla 28.02.2012 um 18:35:44 Uhr
Goto Top
Hallo icsAT!

Weder noch face-wink - ich meinte diese Zeile 1:
ECHO Dim x>"%temp%\msgbox.vbs"
Grüße
bastla
OKIDOKI
OKIDOKI 28.02.2012 um 19:37:49 Uhr
Goto Top
Hallo ihr beiden,
da seht ihr schon wieder mein Unvermögen! Wenn ich eins gelernt habe: Sich so präziese auszudrücken ist so unheimlich schwer, zumal dann die geschriebenen Infos mit den Vorstellungen nicht immer korrelieren ...

(Ich hatte etwas Angst zu sagen, dass ich eine msgbox oder popup Ausgabe haben möchte, da dies schon öfter belächelt wurde. face-wink
Also: In einem Verzeichnis befinden sich mehrere Sicherungskopien. diese sollen "schön" aufgelistet werden (ich dachte es geht nur mit popup ... ), eine Auswahl davon getroffen werden können (siehe bastlas Vorschlag, eben auch mit der Nummerierung) und anschließend soll die ausgesuchte Sicherung zurückgespielt werden (im weiteren Verlauf des batches). Deswegen hatte ich anfangs das so geschrieben, weil ich dachte, ich hänge die Box mit Auslesen der Variabel dann einfach dahinter. 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 ...

Ich hoffe ihr versteht mich ?
Tut mir leid wegen der Verwirrung....
OKIDOKI

PS: bastla: Korrektur an popup-box vorgenommen - du hast ja recht face-wink (Und es steht so oft geschrieben in diesem Forum: ich sehe den Wald vor lauter Bäumen nicht)
icsat
icsat 28.02.2012 um 21:22:14 Uhr
Goto Top
Hallo OKIDOKI,

es tut mir wirklich Leid aber ich kann in Deinem letzten Betrag keine einzige Fragestellung finden. Tschuldigung eine:
Zitat von @OKIDOKI:
Ich hoffe ihr versteht mich ?
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.
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
bastla
bastla 28.02.2012 um 22:25:16 Uhr
Goto Top
Hallo icsAT!

Ich nehme mal an, OKIDOKI wollte etwas in der Art (und nein, schöner mach ich das nicht face-wink):
@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
OKIDOKI
OKIDOKI 29.02.2012 um 09:11:04 Uhr
Goto Top
Super bastla, danke! Genau das was ich gesucht habe!!!

Zwei Fragen hätte ich dennoch: Wie kann ich den Abstand zwischen der Aufzählung und dem Dateinamen vergrößern? Bsp: 1:test.txt --> 1: test.txt
Und wie komme ich zur Sprungmarke, wenn der Ordner leer ist?
... und schöner ist es nicht geworden, sondern genial!

Vielen Dank noch einmal, du hast mir den Tag gerettet!

icsAT: Ich werde versuchen mich präzieser auszudrücken. Danke für deinen Hinweis und deine Hilfe!

OKIDOKI
bastla
bastla 29.02.2012 um 11:22:34 Uhr
Goto Top
Hallo OKIDOKI!

Ansatz für beide Fragen:
Passe die Zeile 6 an, indem Du die Vorgangsweise der Zeilen 4 bis 6 von oben übernimmst (und die Zeile 5 entsprechend umgestaltest):
for /f "tokens=1* delims=:" %%i in ('dir /a/b config^|findstr /n .') do >>"%Liste%" echo %%i : %%j & set /a Max=%%i
Grüße
bastla
OKIDOKI
OKIDOKI 29.02.2012 um 11:33:38 Uhr
Goto Top
Hallo bastla,
das mit dem Abstand funktioniert wunderbar, super! Wenn der Ordner leer ist, meldet er aber: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch."
In der Box sind richtigerweise keine Dateien abgebildet. Aber mit welcher Sprungmarke arbeite ich dann weiter? Denn an dieser Stelle würde ich mir gerne eine Meldung erzeugen, dass keine Dateien vorhanden sind.

Gruß OKIDOKI
bastla
bastla 29.02.2012, aktualisiert am 18.10.2012 um 18:50:10 Uhr
Goto Top
Hallo OKIDOKI!
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
OKIDOKI
OKIDOKI 29.02.2012 um 13:17:01 Uhr
Goto Top
Hallo bastla,

ich werd damit nicht schlauer und schlau daraus auch nicht. Vielleicht kannst du noch einmal drauf gucken, ich habe versucht den Code umzugestalten und abschließend für alle aufzubereiten.
Das Problem jetzt: Die Liste wird nur im Batch aufgerufen, aber verschwindet auch gleich wieder:

@echo off & setlocal
set "Ordner=config"  
set "Liste=%temp%\Liste.txt  
set "Input=%temp%\Input.vbs"  


set /a Max=0
for /f "tokens=1* delims=:" %%i in ('dir /a/b config^|findstr /n .') do >>"%Liste%" echo %%i : %%j & set /a Max=%%i  
If %Max%==0 echo Keine Dateien gefunden! & goto :eof

>>%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 ...  


Gruß OKIDOKI
bastla
bastla 29.02.2012, aktualisiert am 18.10.2012 um 18:50:10 Uhr
Goto Top
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 ... face-sad

Grüße
bastla
OKIDOKI
OKIDOKI 29.02.2012 um 13:45:11 Uhr
Goto Top
Hallo bastla,

schon gemerkt, habe die Zeile 5 ersetzt. Jetzt geht gar nichts mehr face-sad und er kopiert die Listen immer untereinander, so dass die Liste immer länger wird face-sad
Wahrscheinlich liegt es auch am schreienden Baby neben mir, aber ich versteh es nett ...

Grüße
OKIDOKI - ich schäme mich
OKIDOKI
OKIDOKI 29.02.2012, aktualisiert am 18.10.2012 um 18:50:10 Uhr
Goto Top
Ich gebe aber nicht auf face-wink

Vielleicht gehts auch so (als Variante?)
bastla: Prüfen per Batch ob ein Verzeichnis leer ist

@echo off & setlocal
set "Ordner=config"  
if exist "%Ordner%" dir /b /A:-d "%Ordner%">nul 2>nul || goto :leer  
if exist "%Ordner%" dir /b /A:-d "%Ordner%">nul 2>nul  

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 ...  

:leer
echo leer
pause


Jetzt fehlt nur noch der Abstand von 1:XXX -> 1: XXX

Vielleicht hast du noch einen Tipp, das andere bekomme ich so nicht alleine hin ...

Gruß OKIDOKI
bastla
bastla 29.02.2012 um 15:59:33 Uhr
Goto Top
Hallo OKIDOKI!

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
Achtung - bei der Suche in Zeile 17 muss die Darstellungsform (derzeit
Nr : Dateiname
also mit Leerzeichen vor und nach dem ":") im Suchbegriff und als zusätzlicher Delimiter (Leerzeichen) berücksichtigt werden!

Grüße
bastla
OKIDOKI
OKIDOKI 29.02.2012 um 16:10:33 Uhr
Goto Top
Hallo bastla,

du bist mein Held auf dem weißen Pferd - DANKESCHÖN!

PS: In Zeile 17 %Nr% :" %Liste%' gibt es doch kein Delimiter "also mit Leerzeichen vor und nach dem ":") im Suchbegriff und als zusätzlicher Delimiter (Leerzeichen) berücksichtigt werden!"


OKIDOKI
bastla
bastla 29.02.2012 um 16:13:03 Uhr
Goto Top
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:
for /f "tokens=1* delims=:" %%i in ('dir /b/a-d/od "%Ordner%"^|findstr /n .') do >>"%Liste%" echo %%i__%%j
und
for /f "tokens=1* delims=_" %%i in ('findstr /b /c:"%Nr%_" %Liste%') do set "Sich=%%j"
Grüße
bastla
OKIDOKI
OKIDOKI 29.02.2012 um 16:17:48 Uhr
Goto Top
Hallo bastla,

danke für die Erklärung!

So, noch einmal herzlichen Dank!

Zusammenfassend für weitere USER:
Ein Verzeichnis wird ausgewählt, der Ordnerinhalt numeriert angezeigt. Jetzt kann per Auswahl mit der entsprechenden Datei weitergearbeitet werden. Meldungen erfolgen auch wenn kein Ordner vorhanden ist, keine Datei gewählt wurde oder der Ordner leer ist. Auswahl in einem Fenster!

Gruß OKIDOKI
Biber
Biber 29.02.2012 um 19:32:38 Uhr
Goto Top
[OT]
Zitat von @OKIDOKI:
Hallo bastla,

du bist mein Held auf dem weißen Pferd - DANKESCHÖN!
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 ... face-wink

SCNR
Biber
[/OT]
bastla
bastla 29.02.2012 um 19:41:14 Uhr
Goto Top
[OT]
Hallo Biber!
SCNR
Aber geh - Du weißt doch, dass ich hobbymäßig Phlegmadicker bin face-wink (aber das Bild mit dem armen Gaul mag ich mir trotzdem nicht vorstellen) ...

Grüße
bastla
[OT]
OKIDOKI
OKIDOKI 01.03.2012 um 10:58:52 Uhr
Goto Top
Hallo bastla, hallo Biber,

ich bin mir sicher, dass es sich bei diesem Virtualpferd um ein stattliches Tier handelt, auf dem der "Batchelor" würdig durchs Web reitet face-smile
(Sehr schön die Kommentare mit anzusehen, wenn die Arbeit erst erledigt ist face-smile face-smile )

Zu bastlas Nachtrag möchte ich noch ergänzen: Die Codevariante trägt dazu bei, dass die Meldungen bei einer ungültigen Zahleneingabe folgende Ausgaben wegfallen:

FINDSTR: // wurde ignoriert
FINDSTR: /- wurde ignoriert
FINDSTR: /d wurde ignoriert
Datei Nr 13 nicht gefunden!
Drücken Sie eine beliebige Taste . . .


Grüße
OKIDOKI
bastla
bastla 01.03.2012 um 11:02:46 Uhr
Goto Top
Hallo OKIDOKI!

Abseits des tierischen Aspekts face-wink - eigentlich dürfte es keine ungültige Zahleneingabe geben, da nur Werte von 0 bis zur höchsten Dateinummer akzeptiert werden ...

Grüße
bastla
OKIDOKI
OKIDOKI 01.03.2012 um 11:21:23 Uhr
Goto Top
Hallo bastla,

bei 0 findet er die Datei nicht und springt weiter, ab größer als Dateianzahl akzeptiert er die Eingabe nicht und mach gar nichts - was ja eingentlich auch richtig ist. Allerdings könnte "ich betone könnte" face-smile er bei "größer als Dateianzahl" auch dieselbe Meldung auswerfen wie bei einer 0, also "keine Datei gewählt!".

Gruß OKIDOKI
bastla
bastla 01.03.2012, aktualisiert am 08.02.2013 um 00:44:40 Uhr
Goto Top
Hallo OKIDOKI!
Allerdings könnte "ich betone könnte" face-smile 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 ... face-wink

... 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)
zu ändern ...

Grüße
bastla