ronenya
Goto Top

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
)

Content-Key: 91345

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

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

Member: bastla
bastla Jul 04, 2008 at 16:40:00 (UTC)
Goto Top
Hallo ronenya und willkommen im Forum!

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
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:
for /f "delims=" %%i in ('dir /b "%dirpath%\*%Ext%" 2^>nul') do (  
    set /a Anzahl+=1
    set "Script!Anzahl!=%%~i"  
)
[/Edit]
Nur als Anmerkung: Eine "billige" Alternative könnte so aussehen:
>Liste.txt dir /b "%dirpath%\*.tst"|findstr /n .  
Grüße
bastla
Member: 1bgks6
1bgks6 Jul 05, 2008 at 01:05:52 (UTC)
Goto Top
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 face-wink

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%
Member: miniversum
miniversum Jul 05, 2008 at 08:21:16 (UTC)
Goto Top
Vielleicht verstehe ich ja jetzt falsch was du möchtest, aber würde da nicht ein einfaches
dir %dirpath%\*.tst /b 2^>nul|findstr /N ^.*
reichen?

Wenn die unterschiedlichen Farben stören dann halt:
for /F "delims=" %%i in ('dir %dirpath%\*.tst /b 2^>nul|findstr /N ^.*') do echo %%i  
Und wenn dann noch die Trennzeichen halt kein ":" sondern was anderes sein sollen dann:
for /F "tokens=1* delims=:" %%i in ('dir %dirpath%\*.tst /b 2^>nul|findstr /N ^.*') do echo %%i %%j  
Member: Biber
Biber Jul 05, 2008 at 15:49:29 (UTC)
Goto Top
@miniversum
Fussnote:
Wenn die unterschiedlichen Farben stören...
dann ginge auch alternativ find.exe statt findstr.exe

Grüße
Biber
Member: ronenya
ronenya Jul 05, 2008 at 20:06:43 (UTC)
Goto Top
danke. die Losüng über tmp datei ist gut, aber es kann sich an mehrere hunderete Scripts handeln und in der Tat kann vieleicht länger dauern. Übrigens was macht die :: vor dem for genau?
Member: ronenya
ronenya Jul 05, 2008 at 20:11:07 (UTC)
Goto Top
nein hast du richthig verstanden und über findstr /N ist wirklich genial einfach.
Member: ronenya
ronenya Jul 05, 2008 at 20:39:52 (UTC)
Goto Top
Hi miniversum, die Lösungen reicht leider nicht um danach die Eingabe(Scriptnummer) der Benutzer, welche der nummerierte angezeigte Scripte ausgeführt werden soll? mit den 2&3 Vorschläge hat mein (XP sp2) Command Interpreter schon wieder eine von seine sehr hilfreiche Kommentare ausgegeben: "|" ist syntaktisch an dieser Stelle nicht verarbeitbar. Ich verstehe nicht was er will, weil
 'dir %dirpath%\*.tst /b 2^>nul|findstr /N ^.*'   
is der gleiche Expression wie in der erste Vorschlag und ein pipe in Klammer haben viele andere schon benutzt. Anyway, die Scripts Namen in an Array scheint unverzichtbar für das spätere ausführen nach der Usereingabe.
Member: bastla
bastla Jul 05, 2008, updated at Oct 18, 2012 at 16:35:56 (UTC)
Goto Top
Hallo ronenya!

Sieh Dir einmal diesen Thread an - dort hatten wir bereits Ähnliches ...

Grüße
bastla
Member: miniversum
miniversum Jul 06, 2008 at 08:06:35 (UTC)
Goto Top
War ein Fehler von mir. Innerhalb von For musst du das | duch ein ^| ersetzen.
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%