Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Arrays in Batch

Frage Entwicklung Batch & Shell

Mitglied: dedalus2011

dedalus2011 (Level 1) - Jetzt verbinden

12.07.2012, aktualisiert 12:41 Uhr, 3268 Aufrufe, 11 Kommentare

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

01.
set strArrayNumber=0 
02.
 
03.
For %%i IN (C:\test\jpg\"* - ????????_*.jpg") do (for /f %%a in ("%%~ni") ^ 
04.
do (set strArrayValue=%%a && call:functionArray))  
05.
 
06.
goto :end 
07.
                    
08.
:functionArray 
09.
 
10.
set /a strArrayNumber=%strArrayNumber% + 1 
11.
set strArrayName.%strArrayNumber%=%strArrayValue% 
12.
 
13.
goto :eof 
14.
 
15.
:end 
16.
 
17.
set /a i = 1 
18.
 
19.
----> echo %strArrayName.%%i%% 
20.
set temp=%strArrayName.2%  
21.
echo %temp% 
22.
 
23.
pause 
24.
 
25.
 
Mitglied: bastla
12.07.2012, aktualisiert um 13:14 Uhr
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:
01.
setlocal enabledelayedexpansion 
02.
for /L %%i in (1,1,%strArrayNumber%) do echo !strArrayName.%%i! 
03.
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 ...
Bitte warten ..
Mitglied: dedalus2011
12.07.2012 um 17:21 Uhr
Super, danke. Warum klappt es nicht das in einer Variable zu speichern?

01.
set /A var=%%strArrayName.%i%%%  
02.
echo %var% 
03.
 
Gruß
dedalus2011
Bitte warten ..
Mitglied: bastla
12.07.2012, aktualisiert um 21:30 Uhr
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?
Bitte warten ..
Mitglied: pieh-ejdsch
14.07.2012, aktualisiert um 14:00 Uhr
moin,

wenn das Array bei 1 beginnt.
01.
for /f "tokens=1*delims=:" %%i in ('dir/b/a-d-s-h "C:\test\jpg\* - ????????_*.jpg" ^|findstr /n "^" ') do set "strArrayName.%%i=%%j" 
02.
 
03.
 rem für einen Teil davon 
04.
set strArrayName. |findstr /b strArrayName.2[0-3]= 
05.
 
06.
set /a i=5 
07.
set strArrayName. |findstr /b strArrayName.%i%=
Gruß Phil
Bitte warten ..
Mitglied: bastla
14.07.2012, aktualisiert 10.08.2012
@PH
... oder mit "delayedexpansion" (wie oben auch schon dargestellt) - wobei aber immer noch die Frage nach der Sinnhaftigkeit im Raum steht ...

Grüße
bastla
Bitte warten ..
Mitglied: dedalus2011
21.07.2012, aktualisiert um 12:39 Uhr
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?

01.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') ^ 
02.
 
03.
     do if ["%%j"] neq ["%var%"] (set "Zeile=%%j" && echo %%i && set /a t+=1  && set !t!=t && call set "var=%%strArrayName.%!t!%%%" && call :ProcessLine)  
04.
 
05.
        else (set /a t+=1 && set !t!=t && call set "var=%%strArrayName.!t!%%") 
06.
 
Danke für deine Tipps

Gruß
dedalus2011
Bitte warten ..
Mitglied: bastla
21.07.2012, aktualisiert um 14:04 Uhr
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
Bitte warten ..
Mitglied: dedalus2011
21.07.2012, aktualisiert um 17:47 Uhr
hallo bastla,

ich habe folgendes probiert:

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

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

Gruß
dedalus2011
Bitte warten ..
Mitglied: bastla
21.07.2012, aktualisiert um 18:27 Uhr
Hallo dedalus2011!

Ich tendiere in diesem Fall zu einer etwas übersichtlicheren Schreibweise:
01.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do ( 
02.
    if "%%j" neq "!var!" ( 
03.
        set "Zeile=%%j" 
04.
        echo %%i 
05.
        call set "var=%%strArrayName.%%i%%" 
06.
        rem set "var=!strArrayName.%%i! 
07.
        echo !var! 
08.
        call :ProcessLine 
09.
    )   
10.
)
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
Bitte warten ..
Mitglied: pieh-ejdsch
21.07.2012 um 18:26 Uhr
moin dedalus,

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

01.
@echo off 
02.
(for %%i in (a b c ) do @echo %%i 
03.
)>Datei1 
04.
 
05.
(for %%i in (a bx c ) do @echo %%i 
06.
)>Datei2 
07.
 
08.
findstr /n "^" Datei1 >LN1 
09.
 
10.
 rem Für gleiche Zeilen 
11.
findstr /n "^" Datei2 |findstr /xg:LN1 
12.
 
13.
 rem Für unterschiedliche Zeilen 
14.
findstr /n "^" Datei2 |findstr /vxg:LN1 
15.
 
Gruß Phil
Bitte warten ..
Mitglied: dedalus2011
25.07.2012, aktualisiert um 16:54 Uhr
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


01.
               
02.
:functionArray 
03.
 
04.
set /a strArrayNumber=%strArrayNumber% + 1 
05.
set "strArrayName.%strArrayNumber%=%strArrayValue%" 
06.
 
07.
goto :eof 
08.
 
09.
         
10.
:fin 
11.
 
12.
if exist %AusP_CT% for /f "tokens=1* delims=:" %%i in ('findstr /n "^" %AusP_CT%') ^ 
13.
do set "strArrayWert=%%j" && call:functionArray2 
14.
 
15.
goto :fin2 
16.
 
17.
:functionArray2 
18.
 
19.
set /a strArrayZahl=%strArrayZahl% + 1 
20.
set "strArrayNamen.%strArrayZahl%=%strArrayWert%" 
21.
 
22.
goto :eof 
23.
 
24.
:fin2 
25.
 
26.
 
27.
 
28.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') ^ 
29.
do echo %%i && call set "var=%%strArrayName.%%i%%" && set "var=!strArrayName.%%i!" && ^ 
30.
call set "var2=%%strArrayNamen.%%i%%" && set "var2=!strArrayNamen.%%i!" && ^ 
31.
if " %%j" neq "!var2!" ( 
32.
  if " %%j" neq "!var!" ( 
33.
     set "Zeile=%%j" && call :ProcessLine 
34.
  ) else ( 
35.
          if !Aus! == !AusP_ISC! (  
36.
                echo do nothing  
37.
           ) else ( 
38.
                   
39.
		set "Aus=%AusZ%" 
40.
		set "Zeile=%%j" && call :ProcessLine    
41.
         )) 
42.
) else ( 
43.
  if " %%j" neq "!var!" (  
44.
          if !Aus! == !AusP_CT! ( 
45.
               echo do smth 
46.
             ) else ( 
47.
               set "Aus=%AusZ%" && set "Zeile=%%j" && call :ProcessLine               
48.
     )) else ( 
49.
    echo BOTH EQUAL !Aus!  
50.
51.
52.
 
53.
 
54.
 
55.
goto :eof 
56.
 
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...