Nummerierte Menu dynamisch erzeugen
Hi,
Ich habe schon viele Beiträge gelsen aber finde nicht den richtige Lösung. Unten ist der Teil das Skript was ich nicht programmieren kann.
Ich suche test scripts(*.tst) in das Verzeichnis(dirpath) und die möchte den user nummeriert als menu zum Auswahl auflisten. Dabei versuche ich wie man unten sieht die gefundene in eine Art liste zu speichern, aber gleich hier scheitert mein Versuch. Any help ?
set script=
set scripts=
for /F "delims=" %%i in ('dir %dirpath%\*.tst /b 2^>nul') do @set scriptslist=(%scriptslist% %%i) & @set /a sum=sum+1 >nul
for %%script in %scripts% do (
echo %%script
)
Ich habe schon viele Beiträge gelsen aber finde nicht den richtige Lösung. Unten ist der Teil das Skript was ich nicht programmieren kann.
Ich suche test scripts(*.tst) in das Verzeichnis(dirpath) und die möchte den user nummeriert als menu zum Auswahl auflisten. Dabei versuche ich wie man unten sieht die gefundene in eine Art liste zu speichern, aber gleich hier scheitert mein Versuch. Any help ?
set script=
set scripts=
for /F "delims=" %%i in ('dir %dirpath%\*.tst /b 2^>nul') do @set scriptslist=(%scriptslist% %%i) & @set /a sum=sum+1 >nul
for %%script in %scripts% do (
echo %%script
)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 91345
Url: https://administrator.de/contentid/91345
Ausgedruckt am: 19.11.2024 um 09:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo ronenya und willkommen im Forum!
Vorweg einige Fragen:
Das Auslesen und Auflisten selbst könnte etwa so gehen:
Natürlich fehlt noch eine Formatierung der Ausgabe, außerdem könnte eine Sortierung ein Thema sein, ...
Bei dieser Version wird ein "Variablenarray" erzeugt, was die weitere Verwendung erleichtert.
[Edit]
Die Verwendung des Unterprogrammes ":ProcessFile" ist nicht unbedingt erforderlich - da ohnehin schon "delayedExpansion" verwendet wird, genügte auch folgendes "for" als Alternative zur Zeile 6:
[/Edit]
Nur als Anmerkung: Eine "billige" Alternative könnte so aussehen:
Grüße
bastla
Vorweg einige Fragen:
- Wie viele .tst-Dateien werden es im Maximalfall sein?
- Wie oft ändert sich die Anzahl dieser Dateien?
- Was soll nach der Auflistung konkret passieren?
Das Auslesen und Auflisten selbst könnte etwa so gehen:
@echo off & setlocal enabledelayedexpansion
set "dirpath=D:\Test"
set "Ext=.tst"
set /a Anzahl=0
for /f "delims=" %%i in ('dir /b "%dirpath%\*%Ext%" 2^>nul') do call :ProcessFile "%%i"
if %Anzahl% EQU 0 goto :eof
for /L %%i in (1,1,%Anzahl%) do echo %%i_!Script%%i!
::
:: Weitere Verarbeitung
::
goto :eof
:ProcessFile
set /a Anzahl+=1
set "Script%Anzahl%=%~1"
goto :eof
Bei dieser Version wird ein "Variablenarray" erzeugt, was die weitere Verwendung erleichtert.
[Edit]
Die Verwendung des Unterprogrammes ":ProcessFile" ist nicht unbedingt erforderlich - da ohnehin schon "delayedExpansion" verwendet wird, genügte auch folgendes "for" als Alternative zur Zeile 6:
for /f "delims=" %%i in ('dir /b "%dirpath%\*%Ext%" 2^>nul') do (
set /a Anzahl+=1
set "Script!Anzahl!=%%~i"
)
Nur als Anmerkung: Eine "billige" Alternative könnte so aussehen:
>Liste.txt dir /b "%dirpath%\*.tst"|findstr /n .
bastla
help set
help cmd -> /V:ON
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion
Und je nach Betriebssystem/Version/Updatezustand hast Du gewisse Chancen, daß auch
»set scripts=!scripts! %%i«
nicht zum Funktionieren zu bewegen ist, geschweige denn
»set /a sum=!sum!+1«.
Wenn, dann würde Dir allerdings auch ein
for /F %%s in (%scripts%) do echo %%s
nicht dabei helfen, den String %scripts% in Zeilen zu zerlegen. Du hast hier mit Relikten des DISK Operating Systems zu tun, nicht Pipe OS oder RAM OS
Also DISKen wir:
set FL=%TMP%\FL.%RANDOM%.txt
set sum=0
for /f %%s in ('dir %dirpath%\*.tst /b 2^>nul') do (
set /a sum=!sum!+1
echo !sum! %%s >>%FL%
)
::for /f %%s in (%FL%) do echo %%s
type %FL%
:cleanexit
del %FL%
help cmd -> /V:ON
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion
Und je nach Betriebssystem/Version/Updatezustand hast Du gewisse Chancen, daß auch
»set scripts=!scripts! %%i«
nicht zum Funktionieren zu bewegen ist, geschweige denn
»set /a sum=!sum!+1«.
Wenn, dann würde Dir allerdings auch ein
for /F %%s in (%scripts%) do echo %%s
nicht dabei helfen, den String %scripts% in Zeilen zu zerlegen. Du hast hier mit Relikten des DISK Operating Systems zu tun, nicht Pipe OS oder RAM OS
Also DISKen wir:
set FL=%TMP%\FL.%RANDOM%.txt
set sum=0
for /f %%s in ('dir %dirpath%\*.tst /b 2^>nul') do (
set /a sum=!sum!+1
echo !sum! %%s >>%FL%
)
::for /f %%s in (%FL%) do echo %%s
type %FL%
:cleanexit
del %FL%
Vielleicht verstehe ich ja jetzt falsch was du möchtest, aber würde da nicht ein einfaches
reichen?
Wenn die unterschiedlichen Farben stören dann halt:
Und wenn dann noch die Trennzeichen halt kein ":" sondern was anderes sein sollen dann:
dir %dirpath%\*.tst /b 2^>nul|findstr /N ^.*
Wenn die unterschiedlichen Farben stören dann halt:
for /F "delims=" %%i in ('dir %dirpath%\*.tst /b 2^>nul|findstr /N ^.*') do echo %%i
for /F "tokens=1* delims=:" %%i in ('dir %dirpath%\*.tst /b 2^>nul|findstr /N ^.*') do echo %%i %%j
@miniversum
Fussnote:
Grüße
Biber
Fussnote:
Wenn die unterschiedlichen Farben stören...
dann ginge auch alternativ find.exe statt findstr.exeGrüße
Biber
War ein Fehler von mir. Innerhalb von For musst du das | duch ein ^| ersetzen.
Das ganzw würde dann z.B. zu gehen:
Das ganzw würde dann z.B. zu gehen:
@echo off
echo Dateien die zur Wahl stehen:
for /F "tokens=1* delims=:" %%i in ('dir %dirpath%\*.tst /b 2^>nul^|findstr /N ^.*') do echo %%i %%j
set /p "wahl=Bitte Auswahl treffen: "
set "skipt="
if %wahl% neq 1 set "skipt=skip=%wahl% "
set "auswahl="
for /F "%skipt%delims=" %%i in ('dir %dirpath%\*.tst /b 2^>nul') do if not defined auswahl set "auswahl=%%i"
echo Auswahl: %auswahl%