dedalus2011
Goto Top

Arrays in Batch

Hallo,

ich habe mir folgendes Arraykonstrukt überlegt, um Bilddateien in ein Array zu speichern
Es klappt eine bestimmte Position in dem Array abzufragen, allerdings nicht wenn die Position als Variable übergeben wird (z.B. "echo %strArrayName.%%i%%" klappt nicht). Gibt's da Workarounds?

Danke für Eure Tipps.

Gruß
dedalus2011

set strArrayNumber=0

For %%i IN (C:\test\jpg\"* - ????????_*.jpg") do (for /f %%a in ("%%~ni") ^  
do (set strArrayValue=%%a && call:functionArray)) 

goto :end
                   
:functionArray

set /a strArrayNumber=%strArrayNumber% + 1
set strArrayName.%strArrayNumber%=%strArrayValue%

goto :eof

:end

set /a i = 1

----> echo %strArrayName.%%i%%
set temp=%strArrayName.2% 
echo %temp%

pause

Content-ID: 187916

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

Ausgedruckt am: 24.11.2024 um 08:11 Uhr

bastla
bastla 12.07.2012 aktualisiert um 13:14:52 Uhr
Goto Top
Hallo dealus2011!

Ich halte es zwar für grundsätzlich wenig sinnvoll, in Batch ein Array zu simulieren, aber wenn Du glaubst zu müssen, verwende zB folgende Zeile 19:
call echo %%strArrayName.%i%%%
Um alle Elemente abzuarbeiten dann etwa so:
setlocal enabledelayedexpansion
for /L %%i in (1,1,%strArrayNumber%) do echo !strArrayName.%%i!
endlocal
Grüße
bastla

P.S.: Für die Zeilen 3 und 4 sollte auch
For %%i IN ("C:\test\jpg\* - ????????_*.jpg") do set "strArrayValue=%%~ni" & call:functionArray
oder
For /f "delims=" %%i IN ('dir /b/on "C:\test\jpg\* - ????????_*.jpg"') do set "strArrayValue=%%~ni" & call:functionArray
(dann kannst Du vorweg schon nach Namen oder - mit "/od" - nach Änderungsdatum sortieren) genügen ...
dedalus2011
dedalus2011 12.07.2012 um 17:21:31 Uhr
Goto Top
Super, danke. Warum klappt es nicht das in einer Variable zu speichern?

set /A var=%%strArrayName.%i%%% 
echo %var%

Gruß
dedalus2011
bastla
bastla 12.07.2012 aktualisiert um 21:30:37 Uhr
Goto Top
Hallo dedalus2011!

Klappt doch:
call set "var=%%strArrayName.%i%%%"
- und selbst wenn es tatsächlich um eine Zahl ginge, wäre hier "/A" gar nicht nötig ...

Grüße
bastla

P.S.: Magst Du übrigens erzählen, warum Du meinst, ein Array zu benötigen?
pieh-ejdsch
pieh-ejdsch 14.07.2012 aktualisiert um 14:00:12 Uhr
Goto Top
moin,

wenn das Array bei 1 beginnt.
for /f "tokens=1*delims=:" %%i in ('dir/b/a-d-s-h "C:\test\jpg\* - ????????_*.jpg" ^|findstr /n "^" ') do set "strArrayName.%%i=%%j"  

 rem für einen Teil davon
set strArrayName. |findstr /b strArrayName.2[0-3]=

set /a i=5
set strArrayName. |findstr /b strArrayName.%i%=

Gruß Phil
bastla
bastla 14.07.2012, aktualisiert am 10.08.2012 um 16:51:09 Uhr
Goto Top
@ph
... oder mit "delayedexpansion" (wie oben auch schon dargestellt) - wobei aber immer noch die Frage nach der Sinnhaftigkeit im Raum steht ...

Grüße
bastla
dedalus2011
dedalus2011 21.07.2012 aktualisiert um 12:39:51 Uhr
Goto Top
hallo bastla,

ich habe folgendes probiert und es funktioniert nicht (%%strArrayName.!t!%% tut nicht). Könnte es auch dann klappen wenn die index Variable inzwischen inkrementiert wurde?

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') ^  

     do if ["%%j"] neq ["%var%"] (set "Zeile=%%j" && echo %%i && set /a t+=1  && set !t!=t && call set "var=%%strArrayName.%!t!%%%" && call :ProcessLine)   

        else (set /a t+=1 && set !t!=t && call set "var=%%strArrayName.!t!%%")  

Danke für deine Tipps

Gruß
dedalus2011
bastla
bastla 21.07.2012 aktualisiert um 14:04:17 Uhr
Goto Top
Hallo dedalus2011!

Könntest Du vielleicht trotzdem vorweg einmal erklären, was das eigentlich für einen Zweck hat und weshalb Du Dich so auf "Array" versteifst?

Ansonsten:
Weiche auf ein Unterprogramm aus, dann brauchst Du keine "delayedexpansion".
Wozu die Indexvariable, wenn ohnehin in jedem Fall hochgezählt wird und Du in "%%i" mit der Zeilennummer schon einen "Index" zuf Verfügung hast?
Außerdem kann "%var%" in der Schleife nicht funktionieren, wenn Du den Wert von %var% in der Schleife veränderst - dann muss das "!var!" sein.
Am wenigsten klar ist mir allerdings, was Du mit
set !t!=t
bezweckst ...

Grüße
bastla
dedalus2011
dedalus2011 21.07.2012 aktualisiert um 17:47:32 Uhr
Goto Top
hallo bastla,

ich habe folgendes probiert:

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"')   
  do if ["%%j"] neq !var! (set "Zeile=%%j" && echo %%i && call set      
    "var=%%strArrayName.%%i%%" && call :ProcessLine)    

echo !var! ergibt kein Wert..

das Array sollte mir dabei helfen, Zeilen mit dem gleichen Index zu vergleichen.

Gruß
dedalus2011
bastla
bastla 21.07.2012 aktualisiert um 18:27:13 Uhr
Goto Top
Hallo dedalus2011!

Ich tendiere in diesem Fall zu einer etwas übersichtlicheren Schreibweise:
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do (  
    if "%%j" neq "!var!" (  
        set "Zeile=%%j"  
        echo %%i
        call set "var=%%strArrayName.%%i%%"  
        rem set "var=!strArrayName.%%i!  
        echo !var!
        call :ProcessLine
    )  
)
Beide Varianten der Zuweisung (Zeilen 5 und 6) sollten so funktionieren ...
das Array sollte mir dabei helfen, Zeilen mit dem gleichen Index zu vergleichen.
Das sollte sich vermutlich auch einfach in einer "for"-Schleife machen lassen (analog zur Vorgehensweise in Thread "Zwei Texte Zeilenweise zusammenfügen per batch"), aber meinetwegen ...

Grüße
bastla
pieh-ejdsch
pieh-ejdsch 21.07.2012 um 18:26:33 Uhr
Goto Top
moin dedalus,

wenn Du Dateien mit dem selben Zeilenindex vergleichen willst, kommst Du doch mit ein paar Findstr besser.

@echo off
(for %%i in (a b c ) do @echo %%i
)>Datei1

(for %%i in (a bx c ) do @echo %%i
)>Datei2

findstr /n "^" Datei1 >LN1  

 rem Für gleiche Zeilen
findstr /n "^" Datei2 |findstr /xg:LN1  

 rem Für unterschiedliche Zeilen
findstr /n "^" Datei2 |findstr /vxg:LN1  

Gruß Phil
dedalus2011
dedalus2011 25.07.2012 aktualisiert um 16:54:03 Uhr
Goto Top
Hallo und danke Euch beiden für die Hilfe..

Es soll also überprüft werden welche Zeilen in zwei unterschiedlichen Dateien bereits durch "findstr" verarbeitet worden sind. Problem: es sollte der Zeilenindex von den beiden Dateien nur dann inkrementiert werden, wenn die Zeilen bereits abgearbeitet sind. Die Laufzeit ist wesentlich besser wenn die Zeilen einfach übersprungen werden..Kann man das machen?

@phil Die Zeilen sind viel zu lang ("search string too long" ) und können nicht so einfach verglichen werden

Vielen Dank schon im Voraus

Gruß
dedalus2011


              
:functionArray

set /a strArrayNumber=%strArrayNumber% + 1
set "strArrayName.%strArrayNumber%=%strArrayValue%"  

goto :eof

        
:fin

if exist %AusP_CT% for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %AusP_CT%') ^  
do set "strArrayWert=%%j" && call:functionArray2  

goto :fin2

:functionArray2

set /a strArrayZahl=%strArrayZahl% + 1
set "strArrayNamen.%strArrayZahl%=%strArrayWert%"  

goto :eof

:fin2



for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') ^  
do echo %%i && call set "var=%%strArrayName.%%i%%" && set "var=!strArrayName.%%i!" && ^  
call set "var2=%%strArrayNamen.%%i%%" && set "var2=!strArrayNamen.%%i!" && ^  
if " %%j" neq "!var2!" (  
  if " %%j" neq "!var!" (  
     set "Zeile=%%j" && call :ProcessLine  
  ) else (
          if !Aus! == !AusP_ISC! ( 
                echo do nothing 
           ) else (
                  
		set "Aus=%AusZ%"  
		set "Zeile=%%j" && call :ProcessLine     
         ))
) else (
  if " %%j" neq "!var!" (   
          if !Aus! == !AusP_CT! (
               echo do smth
             ) else (
               set "Aus=%AusZ%" && set "Zeile=%%j" && call :ProcessLine                
     )) else (
    echo BOTH EQUAL !Aus! 
  )
)



goto :eof