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

Variable aufrufen, deren Name in einer Variable gespeichert ist.

Frage Entwicklung Batch & Shell

Mitglied: LaserPanzerWal

LaserPanzerWal (Level 1) - Jetzt verbinden

03.11.2011, aktualisiert 18.10.2012, 3112 Aufrufe, 12 Kommentare

Ich und ein Kollege haben uns vorgenommen, ein Spiel (in diesem Fall Schiffe versenken) als Batch-Datei umzusetzen. Jeder versucht es gerade für sich umzusetzen, und natürlich sehe ich es als persönliche Herausforderung als erster fertig zu werden;)
Allerdings komme ich bereits jetzt nicht weiter, weil ich versuche, eine Variable aufzurufen, deren Name sich aus Werten von weiteren Variablen ergibt, die wiederum in einer FOR-Schleife festgelegt werden.
Da das ganze jetzt wahrscheinlich recht verwirrend klingt, hier mal der bisherige Quelltext. Leider habe ich ihn noch nicht wirklich mit Kommentaren versehen, es dürfte aber hoffentlich erkennbar sein, was ich versuche. Die Deklaration der 200 Variablen lasse ich der Übersicht halber weg, sie sind anfangs alle mit einer Tilde (~) gefüllt.

01.
@echo off 
02.
setlocal ENABLEDELAYEDEXPANSION 
03.
set a1=~ 
04.
set a2=~ 
05.
::Hier ist im richtigen Quelltext alles von a1 bis a100 und b1 bis b100 deklariert.... 
06.
set b99=~ 
07.
set b100=~ 
08.
set planning=true 
09.
 
10.
:MAINLOOP 
11.
 
12.
echo   THE ENEMY               YOU 
13.
echo   1 2 3 4 5 6 7 8 9 10    1 2 3 4 5 6 7 8 9 10 
14.
echo 1  %a1% %a2% %a3% %a4% %a5% %a6% %a7% %a8% %a9% %a10%     %b1% %b2% %b3% %b4% %b5% %b6% %b7% %b8% %b9% %b10% 
15.
echo 2  %a11% %a12% %a13% %a14% %a15% %a16% %a17% %a18% %a19% %a20%     %b11% %b12% %b13% %b14% %b15% %b16% %b17% %b18% %b19% %b20% 
16.
echo 3  %a21% %a22% %a23% %a24% %a25% %a26% %a27% %a28% %a29% %a30%     %b21% %b22% %b23% %b24% %b25% %b26% %b27% %b28% %b29% %b30% 
17.
echo 4  %a31% %a32% %a33% %a34% %a35% %a36% %a37% %a38% %a39% %a40%     %b31% %b32% %b33% %b34% %b35% %b36% %b37% %b38% %b39% %b40% 
18.
echo 5  %a41% %a42% %a43% %a44% %a45% %a46% %a47% %a48% %a49% %a50%     %b41% %b42% %b43% %b44% %b45% %b46% %b47% %b48% %b49% %b50% 
19.
echo 6  %a51% %a52% %a53% %a54% %a55% %a56% %a57% %a58% %a59% %a60%     %b51% %b52% %b53% %b54% %b55% %b56% %b57% %b58% %b59% %b60% 
20.
echo 7  %a61% %a62% %a63% %a64% %a65% %a66% %a67% %a68% %a69% %a70%     %b61% %b62% %b63% %b64% %b65% %b66% %b67% %b68% %b69% %b70% 
21.
echo 8  %a71% %a72% %a73% %a74% %a75% %a76% %a77% %a78% %a79% %a80%     %b71% %b72% %b73% %b74% %b75% %b76% %b77% %b78% %b79% %b80% 
22.
echo 9  %a81% %a82% %a83% %a84% %a85% %a86% %a87% %a88% %a89% %a90%     %b81% %b82% %b83% %b84% %b85% %b86% %b87% %b88% %b89% %b90% 
23.
echo 10 %a91% %a92% %a93% %a94% %a95% %a96% %a97% %a98% %a99% %a100%     %b91% %b92% %b93% %b94% %b95% %b96% %b97% %b98% %b99% %b100% 
24.
 
25.
if "%planning%"=="true" ( 
26.
	goto PLANNINGLOOP 
27.
) else ( 
28.
	goto BATTLELOOP 
29.
30.
 
31.
:PLANNINGLOOP 
32.
for /L %%i IN (2 1 5) do ( 
33.
	:REPEATCOMPUTERPLANNING 
34.
	set /a zeile=!random! %%10 + 1 
35.
	set /a spalte=!random! %%10 + 1 
36.
	set /a richtung=!random! %%2 
37.
	set /a laenge=7 - %%i 
38.
	set /a var=!zeile! * 10 - 10 
39.
	set /a var=!var! + !spalte! 
40.
	if "!richtung!"=="1" ( 
41.
	::waagerecht 
42.
		for /L %%o IN (0 1 !laenge! -1) do ( 
43.
			set /a temp=!zeile! * 10 
44.
			if !var! GTR !temp! ( 
45.
				goto REPEATCOMPUTERPLANNING 
46.
47.
			echo !var! 
48.
			echo %%o 
49.
			set /a tempvar=!var! + %%o 
50.
			if NOT "!a!tempvar!!" == "~" ( 
51.
				goto REPEATCOMPUTERPLANNING 
52.
53.
54.
		for /L %%o IN (0 1 !laenge! -1) do ( 
55.
			set tempvar=!var! + %%o 
56.
			set a!tempvar!=M 
57.
58.
	) else ( 
59.
	::senkrecht 
60.
	 
61.
62.
)
In Zeile 50 versuche ich, zu prüfen, ob der Wert der zufällig ausgesuchten Variable eine Tilde ist (also Wasser im Spiel), oder nicht (also ein Schiff, ein beschossenes Feld oder was auch immer).
Das Problem scheint zu sein, dass ich zwar durchaus "echo a!tempvar!" ausgeben oder in einer weiteren variable speichern kann, er mich aber den inhalt dieser variable nicht benutzen lässt, um z.b. die variable a34 aufzurufen (wenn tempvar ==34)
Die Möglichkeiten, das umzusetzen, die ich bisher gefunden habe, mögen ausserhalb der Schleife funktionieren, hier tun sie es aber leider nicht.
Ich hoffe es ist klar was ich hier probiere.
Wer kann mir weiterhelfen?
Mitglied: icsat
04.11.2011 um 08:16 Uhr
Hallo erst mal! (so viel Zeit muss sein)

01.
@echo off
Ist zum finden von Fehlern erst mal eine schlechte Idee!
01.
if NOT "!a!tempvar!!" == "~" (
Da Dir das entfernen von Echo Off allerdings in diesem Fall (Variablen mit !) keinen Aufschluss über die Auflösung der Variablen in dieser Zeile gibt hat sich bei mir zusätzlich bewährt, vor problematisch zeilen mal ein echo zu setzen und das Ergebnis anzuschauen und zu verstehen was wie aufgelöst wird.
01.
echo if NOT "!a!tempvar!!" == "~" (
Da die Variable "a" (!a!) nicht definiert ist und "" (!!) auch keinen Sinn ergibt, sollte das Ergebnis in diesem Fall etwa
01.
if NOT "tempvar" == "~" (
lauten.

Die Lösung für Dein Problem hast Du imho ja schon fast selber geschrieben:
Zitat von LaserPanzerWal:
...
"echo a!tempvar!" ausgeben oder in einer weiteren variable speichern
...
Speicher Dir den Kram einfach in noch einer Variablen zwischen:
01.
set "nochnetempvar=a!tempvar!
und verwende diese dann für deine Abfrage:
01.
if NOT "!nochnetempvar!" == "~" (
Schöne Restwoche

icsAT

(auch dafür war noch Zeit da!)
Bitte warten ..
Mitglied: jeb-the-batcher
04.11.2011 um 11:12 Uhr
Halli Hallo,

und noch eine Technik, nur der Vollständigkeit halber (weil die Methode von icsAT ansich gut funktioniert und übersichtlicher ist).

01.
FOR /F "delims=" %%V in ("!tempvar!") DO ( 
02.
  if NOT "!a%%V!"=="~" ( 
03.
   goto REPEATCOMPUTERPLANNING 
04.
05.
)
Dabei fällt mir noch auf, dass du versuchst innerhalb einer FOR-loop wild mit GOTO's herum zuspringen.
Zum einen verwendet man GOTO mal so gar nicht und nimmer um den Code lesbar und verständlich zu halten(Ok diesen Punkt kann man bei Batch vergessen).

Zum anderen stoppt ein GOTO sofort jede FOR-Loop im aktuellem CALL-Scope,
sprich das ist das Ende deiner Schleife.

Ich denke ein paar elegante Funktionen würden der Lesbarkeit hier ohnehin nicht schaden.

jeb
Bitte warten ..
Mitglied: mathe172
04.11.2011, aktualisiert 18.10.2012
Hallo,

entweder ich überseh da was, oder bei der Möglichkeit von icsat ist etwas falsch. Man prüft ja, ob der Inhalt von "Nochnetempvar" =="~" ist. Der Inhalt ist aber "a23" oder "a15".

Vielleicht noch eine andere Möglichkeit:
01.
set "a15=~" 
02.
set "tempvar=15" 
03.
call echo %a%tempvar%%
Und was du dir auch noch anschauen solltest sind Pseudo-Arrays in Batch - das würde das ganze erheblich verkürzen. Schau mal hier.

Mit freundlichen Grüßen,
Mathe172
Bitte warten ..
Mitglied: jeb-the-batcher
04.11.2011 um 15:29 Uhr
Hallo mathe0815,

wobei das mit den Pseudo-Arrays vermutlich am Ende auf die gleiche Problematik hinausläuft

Kleiner Tippfehler (es fehlt ein %)
01.
call echo %%a%tempvar%%
Aber das übel an der CALL Lösung ist, CALL ist extrem langsam und auch nicht sicher an dieser Stelle.

Dies testen und wundern ...
01.
echo rem /? >echo%~x0 
02.
set "a15=~"  
03.
set "tempvar=15"  
04.
call echo %%a%tempvar%%
Das erklärt auch warum CALL so langsam ist

jeb
Bitte warten ..
Mitglied: mathe172
04.11.2011 um 17:11 Uhr
@ jeb: Also bei mir funktioniert meine Variante, obwohl ich nicht verstehe, warum es nicht "call echo %%a%tempvar%%%" heissen muss.

Mathe172
Bitte warten ..
Mitglied: icsat
04.11.2011 um 20:45 Uhr
Hallo mathe172,

wenn man auf die Schnelle ungetestete Codezeilen postet darf man sich nicht wundern, wenn am Ende nur Müll dabei rauskommt! Das oben produzierte Ergebnis hat am Ende genau das Problem, welches der TE ja ausführlich beschrieben hat. Es lässt sich so nicht weiterverarbeiten.

Daher ziehe ich meinen unqualifizierten Kommentar von heute Morgen hiermit zurück. Vielen Dank, dass Dir das aufgefallen ist.

Der von Dir angesprochene Call wäre da tatsächlich ein Lösung. Damit müsste meine Definition der zusätzlichen Variable
01.
call set "nochnetempvar=%%a!tempvar!%%"
lauten, wobei das auch nur dann funktionieren kann, wenn die "a"-Variable außerhalb der Schleife gesetzt wurde. Ich würde hier eindeutig die Variante von jeb-the-batcher vorziehen.

Gruß icsAT
Bitte warten ..
Mitglied: icsat
04.11.2011 um 21:08 Uhr
Hallo,

die erste Variante von mathe172
01.
call echo %a%tempvar%%
funktioniert bei der direkten Eingabe. Im Batch hingegen ist das Ergebnis "tempvar".

Die Variante von jab-the-batcher
01.
call echo %%a%tempvar%%
funktioniert nicht. Bei direkter Eingabe "%~" und im Batch "a15".

die zweite Variante von mathe172
01.
call echo %%a%tempvar%%%
funktioniert im Batch. Bei der direkten Eingabe hingegen ist das Ergebnis "%~%".

Da das eigentliche Problem aber gelöst ist, war dieser Kommentar dann wohl OT. Sorry dafür.


Schönes WE

icsAT
Bitte warten ..
Mitglied: jeb-the-batcher
05.11.2011 um 10:18 Uhr
Hallo icsAt,

Zitat von icsat:

01.
call set "nochnetempvar=%%a!tempvar!%%"
lauten, wobei das auch nur dann funktionieren kann, wenn die "a"-Variable außerhalb der Schleife gesetzt wurde.

Die "a"-Variable gibt es ja gar nicht, die Variable heißt ja "a15" und dein Code funktioniert natürlich auch innerhalb der Schleife,
dafür ist ja der CALL Befehl da.

Man kann auch ganz ohne delayed expansion innerhalb der Schleife arbeiten
01.
call call set "contentOfVar=%%%%a%%tempvar%%%%%%"
Aber scheinbar hat keiner mein zweites "Wunder"-Beispiel ausprobiert
Da hätte ich nämlich mit Reaktionen gerechnet

jeb
Bitte warten ..
Mitglied: pieh-ejdsch
05.11.2011 um 22:21 Uhr
moin jeb,

wieso denn "Wundern"? - Fragen!
call ruft die Batch echo.cmd mit dem Parameter, welcher aus der %%Pseu%DOvariable%% besteht aus dem Verzeichnis auf.
Nur der Parameter entspricht nicht ganz der erwarteten Variable - warum überhaupt?
erst wird %tempvar% nach 15 aufgelöst (was warscheinlich heist: erst werden Vorhandene Variablen aufgelöst) und die Variable %a die gibt es nicht
  • aber das komischste daran: die Variable "%a15" gibt es nit - warum steht dann etwas da?

[Edit]
ach ja - erst wird das Dopplte Prozent zu einem Prozent und dann %Tempvar% aufgelöst. Das Letzte Prozent ist nur eins und wird im Batch ja gelöscht.
ist geklärt warum doch etwas da steht.
[/Edit]

for /L %%o IN (0 1 !laenge! -1) do ( 
Auch wenn es geht: für was ist -1? Falls das Boot zu kurz ist? laenge ist doch immer definiert.

Gruß Phil
Bitte warten ..
Mitglied: icsat
07.11.2011 um 15:02 Uhr
Hallo,

schönen Start in die Woche.

Zitat von jeb-the-batcher:
Die "a"-Variable gibt es ja gar nicht, die Variable heißt ja "a15" und dein Code funktioniert
natürlich auch innerhalb der Schleife,
dafür ist ja der CALL Befehl da.

Mit die "a"-Variable war natürlich a1 bis a100 oder in unserem Beispiel a15 gemeint. Ansonsten gebe ich Dir recht.


Gruß icsAT
Bitte warten ..
Mitglied: LaserPanzerWal
07.11.2011 um 19:58 Uhr
Hallo wiedereinmal, und Danke schonmal für die vielen Antworten.

Leider funktioniert das mit der Variable trotzdem nicht so recht. Es klappt zwar mit den beschriebenen Möglichkeiten wunderbar in einer neuen Batch, aber wenn ich es in einer Schleife laufen lassen will weigert er sich strikt, so zu funktionieren wie ich das gerne möchte. Egal wie ich es anstelle, er gibt mir entweder den Variablennamen aus (z.b. a15) oder er meldet mir dass Echo off gesetzt ist, also die angegebene Variable vermutlich leer (und damit nicht richtig) ist. Allerdings will ich auch ungern die Schleife durch ein Pseudo-Schleifen-GOTO-gewurstel ersetzen, nur um das Problem zu umgehen, denn das kann nicht die wirklich sinnvolle Lösung sein.
Mach ich einfach nur irgendetwas falsch, oder klappt das in einer Schleife nicht so einfach?

Grüße,
der Wal =)
Bitte warten ..
Mitglied: mathe172
09.11.2011 um 18:02 Uhr
Hallo,

wahrscheinlich könnte man dir einfacher Helfen, wenn du uns den Code zeigen würdest.
Schau dir mal "setlocal enabledelayedexpansion" an. Und was die Pseudoschleifen angeht, ich würde eher Pseudo-Call-Subs benutzen

Mit freundlichen Grüßen,
Mathe172
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst DWORD (Name immer verschieden) eines RegKeys auslesen und in Variable schreiben (2)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

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

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 ...