DIR-Ausgabe in BAT-Array?

Gibt es eine Möglichkeit, die Ausgabe eines Befehls ‘dir’ in ein Array in einer BAT-Datei einzulesen? Oder müsste ich es zuerst in eine Datei ausgeben, dann die Datei lesen und die Datei danach löschen?

Der Zweck besteht darin, eine Liste von Ordnern in einem Verzeichnis zu erhalten, eine Nummer an jeden anzuhängen und dann den Benutzer zur Eingabe eines numerischen Wertes aufzufordern, um einen Ordner auszuwählen.

UPDATE: Verstanden!

SETLOCAL EnableDelayedExpansion SET /A c=1 FOR /F "tokens=*" %%F in ('dir /on /b /a:d /p %svnLOCAL%') DO ( ECHO !c!. %%F SET dir_!c!=%%F SET /ac=c+1 ) REM test array ECHO !dir_4! ENDLOCAL 

   

Batch unterstützt Arrays nicht formal, aber Sie können Arrays mithilfe von Umgebungsvariablen emulieren.

 @echo off setlocal enableDelayedExpansion ::build "array" of folders set folderCnt=0 for /f "eol=: delims=" %%F in ('dir /b /ad *') do ( set /a folderCnt+=1 set "folder!folderCnt!=%%F" ) ::print menu for /l %%N in (1 1 %folderCnt%) do echo %%N - !folder%%N! echo( :get selection set selection= set /p "selection=Enter a folder number: " echo you picked %selection% - !folder%selection%! 

Im obigen Code heißen die Elemente “array” Ordner1, Ordner2, Ordner3 …

Manche Leute benutzen stattdessen Namen wie Ordner [1], Ordner [2], Ordner [3] …. Es sieht sicherlich mehr Array ähnlich, aber genau deshalb mache ich das nicht. Leute, die nicht viel über Batch wissen, sehen Variablen wie diese und gehen davon aus, dass Batch Arrays korrekt unterstützt.

Die obige Lösung funktioniert nicht richtig, wenn einer der Ordnernamen das ! character – Der Name des Ordners wird während der Erweiterung der Variablen %% F wegen verzögerter Erweiterung beschädigt. Es gibt einen Work-Around, bei dem die verzögerte Erweiterung ein- und ausgeschaltet wird, aber es lohnt sich nicht, hineinzukommen, wenn es nicht benötigt wird.

Dies ist keine Antwort, sondern ein großer Kommentar als Antwort auf Dbenhams Antwort.

Mein Standpunkt zu dieser Angelegenheit ist genau das Gegenteil von Dbenhams. Meiner Meinung nach, in Antworten auf Batch-Themen müssen wir sehr kurz und klar sein, vor allem mit Anfängern, und bieten die minimalen Informationen, die helfen, das Problem zu lösen, aber nicht zu überwältigen und die Antworten zu verwirren. Es gibt zwei Möglichkeiten, Arrays in Batch zu simulieren : über die weit verbreiteten eckigen Klammern, um den Index einzuschließen, oder nicht, aber in beiden Fällen ist das Konzept dasselbe: Wählen Sie ein bestimmtes Element aus einer Liste von Variablen mit demselben Namen über einen numerischen Index .

Wenn eckige Klammern nicht verwendet werden, würde ein Anfänger das corekonzept nicht verstehen; Stattdessen könnten sie denken, dass die Batch-Datei einen “seltsamen Trick” verwendet hat, um das Problem zu lösen. Ein erfahrener Programmierer dagegen würde mit Sicherheit sagen: “Hey! Das ist ein Array, aber auf eine andere Art geschrieben”. Es gibt keine Möglichkeit, diese function für andere Dinge zu missbrauchen, und keinen Grund, sie als etwas anderes zu tarnen.

Wenn eckige Klammern verwendet werden, findet ein Anfänger viele Informationen über das “Array” -Konzept und viele Beispiele zu diesem Thema in vielen Programmiersprachen und sogar Beschreibungen, die unabhängig von irgendeiner Programmiersprache sind, die natürlich unmittelbar in Batch-Dateien verwendet werden . Die Verwendung von eckigen Klammern ist in diesem Fall viel deutlicher, als dies zu tun. Einige Leute denken jedoch, dass diese Vorteile nicht die “Verwirrung” der Annahme, dass Batch “formal Arrays unterstützen”.

Meiner Meinung nach ist der zentrale Punkt in dieser Angelegenheit nicht zu diskutieren, ob Batch formell Arrays unterstützt oder nicht, sondern die Tatsache, dass Leute das Array-Konzept verwenden können, um Daten in Batch-Dateien zu manipulieren. Ich sehe überhaupt keine Probleme mit der Möglichkeit, dass einige Leute denken, dass Batch Arrays, besonders die Anfänger, richtig unterstützt; Das Array-Management unterscheidet sich in verschiedenen Programmiersprachen, daher wäre eine Erläuterung der Batch-Details erforderlich. Wenn jedoch eine formellere Diskussion dieses Themas wichtig erscheint, möchte ich ein anderes Beispiel nennen.

Wissen Sie, dass die C-Programmiersprache keine Eingabe-Ausgabe-Operation “formal unterstützt”? Als Dennis Ritchie es entwickelte, ließ er diese Operationen ausdrücklich außerhalb des Sprachdesigns, um den Compiler klein und kompakt zu halten. Bedeutet das, dass Sie in C-Programmen KEINE Daten lesen / schreiben können? Natürlich nicht! Dies bedeutet nur, dass diese Operationen außerhalb des Compilers über functionsbibliotheken implementiert werden. Wenn Sie also einen C-Compiler entwickeln müssen, brauchen Sie sich keine Gedanken darüber zu machen, wie Sie PRINT, READ oder andere I / O-statementen kompilieren, weil sie einfach nicht existieren in C-Sprache!

Interessant, nicht wahr?

Wenn also ein Anfänger fragen würde: “Wie schreibe ich eine Nachricht in C?”, Denken Sie, die richtige Antwort sollte lauten: “Sie können nicht. Die Sprache C unterstützt formal keine E / A- Aussage , aber Sie können emulieren solche Operationen über Bibliotheksfunktionen “? Natürlich nicht! Die meisten Leute würden einfach printf beschreiben, aber praktisch niemand erwähnt, dass printf () NICHT Teil der C-Sprache ist und ich denke, das ist richtig. Was ist in der ultimativen Analyse das Problem, wenn jemand denkt, dass die C-Sprache I / O-Operationen unterstützt? Leute können I / O-Operationen in C-Programmen verwenden, egal wie sie implementiert wurden, oder?

Nun, meiner Meinung nach sollte der gleiche Ansatz bei Arrays in Batch verwendet werden.

Vielleicht ein genaueres Beispiel: Es gibt viele Fragen zu “arithmetischen Operationen in Batch” und die Antwort lautet normalerweise: ” set /A command”. Ich habe nie eine Antwort gesehen, die darauf hinweist, dass “Batch-Dateien keine numerischen Variablen unterstützen, sondern nur Strings, aber arithmetische Operationen können auf verschiedene Arten emuliert werden, wie der Befehl set /A “. Warum? Es scheint, dass die Puristen “mehr Puristen” sind, wenn sie sich über Arrays in Batch unterhalten, aber sie interessieren sich nicht für andere Themen wie Zahlen. Ich verstehe den Zweck der häufigen Klärung über “Batch unterstützt keine Arrays” wirklich nicht! SO user rojo meinte zu diesem Punkt: “Es ist ein pedantisches Argument, das keine Lösung für die Probleme bietet, die die Fragesteller lösen wollen” (siehe seinen vollständigen Kommentar über diese Antwort ).

Antonio