Top-Themen

Aktuelle Themen (A bis Z)

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, 3332 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 ..
Ähnliche Inhalte
PHP
Aus Arrays neue Arrays erzeugen!
gelöst Frage von FunkerVogtPHP8 Kommentare

Hallo Gemeinde, ich hoffe Ihr könnt mir bei meiner Problematik helfen und meinen kleinen gordischen Knoten im Kopf lösen. ...

Visual Studio
Verschachtelte Arrays
gelöst Frage von MarcoBornVisual Studio19 Kommentare

Hallo Forum, ich habe in VB.NET 6 Arrays, die alle dieselbe Länge, aber unterschiedliche Datentypen haben. Array1 ist vom ...

Windows Server
Arrays vergleichen mit Powershell
gelöst Frage von SlainteMhathWindows Server5 Kommentare

Moin, ich sitze hier vor einen Problem mit Powershell, das mich schier wahnsinnig macht. Hintergrund: Die auf einem Windows ...

Visual Studio
Probleme mit mehrdimensionalen Arrays in VB.NET
gelöst Frage von MarcoBornVisual Studio10 Kommentare

Hallo Forum, ich versuche gerade, in VB.NET ein mehrdimensionales Array zu definieren, dann mit Werten zu füllen und anschließend ...

Neue Wissensbeiträge
Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 4 StundenInternet3 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registierunf von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Verschlüsselung & Zertifikate

19 Jahre alter Angriff auf TLS funktioniert immer noch

Information von BassFishFox vor 10 StundenVerschlüsselung & Zertifikate1 Kommentar

Interessant zu lesen. Der Bleichenbacher-Angriff gilt unter Kryptographen als Klassiker, trotzdem funktioniert er oft noch. Wie wir herausgefunden haben, ...

Windows 10

Windows 10 Fall Creators Update - Neue Funktion Hyper-V Standardswitch kann ggf. Fehler bei Proxy Configs verursachen

Erfahrungsbericht von rzlbrnft vor 21 StundenWindows 103 Kommentare

Hallo Kollegen, Da wir die Gefahr lieben, haben wir bei einigen Usern nun mittlerweile das Creators Update drauf. Einige ...

Sicherheit

TLS-Zertifikat und privater Schlüssel von Microsofts Dynamics 365 geleakt

Information von Penny.Cilin vor 23 StundenSicherheit

Microsoft hat versehentlich das TLS-Zertifikat inklusive dem privaten Schlüssel seiner Business-Anwendung Dynamics 365 geleakt. TLS-Zertifikat und privater Schlüssel von ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

Netzwerkmanagement
NAS über zwei weitere Ethernet Anschlüsse verbinden
gelöst Frage von Sibelius001Netzwerkmanagement16 Kommentare

Sorry - ich bin hier wahrscheinlich als kompetter IT Trottel unterwegs. Aber eventuell kann mir jemand ganz einfach helfen: ...

LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless16 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...