florengray
Goto Top

Variablenproblem set Slashp PNProzentzeichenCVProzentzeichen

Hallo,
es war schwierig hier nach dem zu suchen was ich wiisen wollte.
(Suchbegriffe)
Ich hab nichts gefunden, also --> neuer Tread.

Entschuldigt bitte auch die etwas merkwürdige Überschrift.

Kurz und knapp:

ich möchte Fortlaufende Vriablen festlegen.

set /p PN%CV%=Bitte den Programmnamen eingeben:

Zuerst wird in CV pro Durchgang eine fortlaufend steigende Zahl definiert. Sagen wir mal 1.
Dann wollte ich eigentlich eine Variable mit PN1 definieren die dann den Programmname enthält.
Beim nächsten Durchgang wäre das dann PN2 und ein anderer Programmname dann PN3 ...
Aber das %CV% wird nicht akzeptiert.

Geht das grundsätzlich nicht?

Ich bin ratlos was ich machen könnte.
Ich hab zwar ne überaus umständliche Lösung aber die ist so umständlich, sodass sich mein Programm um etwa 135% Text vergrößern würde.
Wollt ich eigentlich nicht.

Hat da jemand so spät noch eine Idee?
Ich hab wahrscheinlich schon abgeschaltet.

florengray

Content-ID: 75328

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

Ausgedruckt am: 25.11.2024 um 08:11 Uhr

Biber
Biber 06.12.2007 um 07:17:36 Uhr
Goto Top
Moin florengray,

das sollte schon gehen, so wie Du es geplant hast.
>for /l %i in (1,1,3) do @set /p "PN%i=pn%i? "  
pn1? eins
pn2? zwei
pn3? drei

>set pn
PN1=eins
PN2=zwei
PN3=drei
[ an den Anführungszeichen hier:{ set /p "PN%i=pn%i? "} liegt es nicht, geht auch ohne.]

Hast Du evtl in der Variable %CV% ein Leerzeichen, also %CV% =" 1" oder "1 "?
Poste doch mal bitte die relevanten Zeilen des Skripts.

Grüße
Biber
florengray
florengray 06.12.2007 um 09:53:30 Uhr
Goto Top
:: Variablen mit %Programmname% werden später an Install.bat übergeben.

echo 0 >%BSL%CVPN.dat
:nPN
set /p CV=<%BSL%CVPN.dat
set /a CV=%CV%+1
echo %CV% >%BSL%CVPN.dat
set /p PN=Bitte geben Sie jetzt den %CV%. Programmnamen an:
rem hier sollte eigentlich das mit dem set /p=PN%CV%=... hin.

echo %CV%.: %PN% >>%BSL%tmp_IRoutinePN.txt
set /p PNü=Programm Hinzufügen (n) Verlassen (e):
if %PNü%==n goto nPN
del %BSL%CVPD.dat
set AIP=%CV%
%BSL% ist das Betriebssystemlaufwerk in der Regel C:\
%CV% wird ja hochgezählt ohne Leerzeichen.
Und die Datein sind nur temporäre Dateien.
florengray
florengray 06.12.2007 um 12:33:30 Uhr
Goto Top
OK, das was ich wollte habe ich bis jetzt hingekriegt.
Vielen Dank!
Hier mein Schnipsel:
%BSL% ist hier z.B.:C:\

echo 0 >%BSL%CVPN.dat
set CVN=0
:nPN
set /p CV=<%BSL%CVPN.dat
set /a CVN=%CVN% + 1
set /a CV=%CV%+1
echo %CV% >%BSL%CVPN.dat
for /l %%i in (%CVN%,1,%CV%) do @set /p "PN%%i=Bitte geben Sie jetzt den %%i. Programmnamen an:" & echo %%i. Programmname: !PN%%i! >>PGN.txt  
set /p PNü=Hinzufügen (n) Verlassen (e):
if %PNü%==n goto nPN
del %BSL%CVPN.dat
set AIP=%CV%
Werde das dann noch weiter anpassen.
Aber nochmals vielen Dank!
Biber
Biber 06.12.2007 um 12:50:52 Uhr
Goto Top
Moin florengray,

ich habe Deine Skripte in -Formatierungen gesetzt.

Ich lasse den Beitrag mal offen - vielleicht kommt ja noch eine final version im Lauf der Tage.

Grüße
Biber
florengray
florengray 06.12.2007 um 17:29:22 Uhr
Goto Top
Die Final Version kommt noch nicht.

Ich hab jetzt die For Schleife ausgebaut und darin noch viele weitere Anweisungen mit &...&...
verknüpft.
Ich muss aber unbedingt noch innerhalb der Schleife, weil da nur
die Variablen %%i und !PN%%i! gültig sind, eine Art Zwischenstopp mit einer set /p Anweisung einfügen.
Es soll noch eine Variable in eine Datei geschrieben werden, ob das Programm eine *.exe oder ein *.msi ist.
Ich kann zwar in der Schleife irgendwo eingeben, ob das eine exe oder msi ist, aber die Variable wird erst beim nächten Durchlauf in das nächste Programm erst geschrieben.
Genau eine Runde zu spät!
Ich hab da mal von Variablen Verzögerung gehört.

Wenn ihr mir hier noch helfen könnt, wäre das echt spitze!
Mir reicht eigentlich schon sowas wie
for %%i in (irgendwas) do xyz & set /p Wi= & echo %Wi% >>%BSL%Programm.bat

Die Abfrage mit set /p kommt ja, aber anscheinend wird der Inhalt erst beim nächsten Durchlauf geschreiben.
Biber
Biber 06.12.2007 um 18:52:07 Uhr
Goto Top
Moin florengray,

in Deinem Fall brauchst nicht unbedingt die DelayedExpansion.
Aber wenn Du sie verwenden willst:

@echo off & Setlocal EnableDelayedExpansion

...
for %%i in (irgendwas) do call :subBlock %%i
.....
goto :eof

:SubBlock
xyz 
set /p "W%1=gib was für W%1 ein: "  
echo Variable W%1 hat den Wert !Wi%1! >>%BSL%Programm.bat
goto :eof
Aber ich sehe nicht, dass Du den Variablennamen "Wxxx" irgendwo brauchst.
Du könntest ebensogut immer den gleichen Variablenname verwenden.

Grüße
Biber
florengray
florengray 06.12.2007 um 19:23:42 Uhr
Goto Top
Ja doch ich brauche den Variablennamen.
Nur wenn ich im meinen Code hier jetzt poste, dann sind das mehrer Seiten.
Erinnert ihr euch noch an das Programm was alles selbst installieren sollte?

Ich muss, um die Programme starten zu können zwischen exe und msi unterscheiden können.
Also muss innerhalb der FOR Schleife der Benutzer gefragt werden, ob das eine exe oder msi Anwendung ist.
(Das Programm ist nur für erfahrene Anwender gedacht)
Wenn es fertig ist poste ich das gerne.
Müsstet mir nur sagen wo.
Copyright muss ich mir noch überlegen.

Das ganze ist so verzwickt, da ich mehrer Installroutinen anlegen muss.
Deren spezifische Bezeichnung ist aber nur in der For gültig.
Das mit dem Call :xyz bin ich auch gerade dran.
Aber ich hab wieder vergessen den Parameter %%i zu Übergeben.

Das mit den Parametern habe ich anders gelöst.
Ich schreibe die in eine Temp Datei, da ich Schwierigkeiten habe den !PN%%i! zu Übergeben.
Naja, temp Dateien sind auch nicht schlecht.
So jetzt zweifel ich aber an der Welt der Bits!
Meinetwegen ist %%i 1 und wird in die datei xyz.dat geschrieben.
!PN%%i! ist Acronis_True_Image in der Datei zyx.dat.

Jetzt der :SubBlock
Die Var. Wi enthält jetzt msi.
Die 1 wird in die Var. %VPi% per set /P =< gelesen, dasselbe mit ATI. %VPPN%
Jetzt möchte ich den lang ersehnten Wi=msi in die Datei
1_Acronis_True_Image.bat per echo ...>> hinzufügen.

Theoretisch:
echo set Wi=msi >>C:\%VPi%_%VPPN%.bat
Ziel:
Der Subblock hat ausserhalb der For Schleife die Variable Wi, die die Information msi enthält,
hinzugefügt.
Was rauskommt ist aber Eine Datei 1.
Ohne Endung ohne alles. Drin steht: msi 1 _ Acronis_ True _ Image
Das wars.
Aber ich bin wahrscheinlich nur überarbeitet.

PS: Copyright war nur ´n Scherz!
Ist natürlich für alle!
florengray
florengray 06.12.2007 um 21:01:17 Uhr
Goto Top
Das mit Copyright war wirklich nur´n Scherz!

Ich bitte um Entschuldigung!
War ´n dummer Scherz.

florengray
Biber
Biber 06.12.2007 um 21:18:30 Uhr
Goto Top
*lach*

Ich denke nicht, dass nun niemand mehr wegen Deiner Copyright-Bemerkung gepostet hat.
Aber die andere Vermutung, die mit der Überarbeitung bzw. dem "Zu-lange-auf-dieselben-10-Codezeilen-starren", das könnte ein Grund sein.

Denn Deine letzte Plan-Beschreibung sieht von weitem aus wie Sack gequirlte Hühnerbeinchen.
Und aus der Nähe auch nicht besser, mit Verlaub gesagt.

Lass uns doch nach einer Pause oder morgen weitermachen.
Oder wird die Hölle zufrieren, wenn Du das nicht bis 22h fertig hast?

Na also
Biber
florengray
florengray 06.12.2007 um 21:52:31 Uhr
Goto Top
Man bin ich froh, das man mir das mit dem Copy nicht übergenommen hat!!! *freu!*

Ja stimmt. Nur einer der die Var. kennt kann das lesen.
Aber ich bin ein Mensch, der erst schlafen gehen kann, wenn wir ein dickes Problem wenigstens annähernd gelöst haben.

Also nochmal geordnet:

Vorgeschichte:
Meine Hauptbatch legt viele Installationsbatches an, die nacheinander in den Autostart kopiert (übernimmt der Counter.bat) werden und dann die Installation von einem Paket an Programmen ausführen.

Viele benötigen einen unmittelbaren Neustart, darum gehen viele nur einzelnd.

Da ich die aus systematischen Gründen durchnummerieren muss, ist der erste Parameter oder die Variable in der riesen For Schleife ein %%i.
Das wird, wenn man will, unendlich hochgezählt = unendlich viele Programme, die inst. werden sollen.

Dann wird noch aus Ordnungsgründen der Installationsbatch ein Name vergeben. Hier: immer der Name des Programms, das man installieren will.

Die erste Installationsbatch könnte demnach heißen: 1_AcronisTrueImage.bat
Die nächste dann vielleicht: 2_OfficePaket.bat

Dafür brachte ich die set /p innerhalb der For Schleife. -- Programmname

Da ich aber auch Programme habe, die keine exe sind, sondern auf msi enden, muss ich eine weitere Variable in die jeweilige Installationsbatch schreiben, damit dann später eine andere Batch (DL_.bat) genau weiss, dass sie jetzt eine msi oder eine exe aufzurufen hat.
Das ist bei mir die Var. %Wi% In %Wi% schreibt der Benutzer dann rein: msi oder exe
Das wollte ich dann nachträglich im :SubBlock (per call von der For Schleife aus aufgerufen) der Installationsbatch hinzufügen.

Letztendlich sollen in der Installationsbatch drei wichtige Variablen enthalten sein, die dann an die universelle DL_.bat übergeben werden können.
1. Programmname
2. Programmnummer
3. exe oder msi --> Wi

Problem: Die Zeile: echo set Wi=%Wi% aus dem :SubBlock schreibt mir diese wichtige Information nicht in die Batch. Legt aber eine irgendwas an.
Z.B. C:\1
Eine art Datei ohne Endung, mit dem Namen 1 und uninteressantem Inhalt.

Zeile: echo set Wi=%Wi% >>%BSL%%VPi%_%VPPN%.bat

%Wi% wurde erklärt, %BSL% enthält das aktuelle Btreibssystemlaufwerk: C:\, %VPi% ist die Nummer des Programms, die von der For Schleife aus generiert wurde, %VPPN% ist der Programmname, den der Benutzer in der For Schleife eingegeben hat.
Da aber die Variablen in einer For Schleife nur innerhalb der Schleife gültig sind, müsste ich sie irgendwie "beständig" machen. Also habe ich Sie temporär in zwei Dateien geschrieben, damit der :SubBlock die dann außerhalb der Forschleife auch benutzen kann und die Information der richtigen Installationsbatch zuordnen und hinzufügen kann. Alles in einem Durchlauf.

Geht aber nicht.
Warum wiess ich nicht.
Ist eigentlich nur stupides ersetzen, aber daran scheitert das Ganze.

Nun meine Frage, weil ich am verzweifeln bin, warum das an so etwas logisch einfachem scheitert, wie oder was mache ich falsch?

Ich hoffe ich habe nichts vergessen.
Sonst muss ich mal einen detailreichen Gesamtplan von meinem Programm hier posten.
florengray
florengray 08.12.2007 um 11:35:11 Uhr
Goto Top
Hallo,
also das Problem habe ich gelöst.
Ich habe in der FOR Schleife doch die Parameter beim call :SubBlock übergeben.
Hatte nur gedacht, ich müsste bei !PN%%i! noch % Zeichen mit reinmischen müssen.
Jetzt geht das zumindest einfandfrei.

Damit wäre das Problem eigentlich gelöst, außer es tritt jetzt noch kurzfristig was auf.

Danke für die Hilfe.

Ach ja, wer merkwürdige Fehleranzeigen bei dieser Code Zeile haben sollte, der kann das mit einer for Schleife umgehen.
Code 1: set /p y=<C:\test.txt
Gibt z.B. bei mir manchmal "System kann angegebene Datei nicht finden" aus obwohl die Datei existiert.
Code 2: for %%x in ('type C:\test.txt') do set y=%%x
Da passiert das nicht.
Komischerweise.


@Biber
Ich hab vor Kurzem erst über Batch und Fortschrittsbalken was wissen wollen.
Da hab ich noch Phänomene beabachtet, die mir unlogisch erscheinen.
Wenn du den Beitrag nochmal öffnen könntest?
Muss aber nicht unbedingt sein.

Ansonsten schönen 8. Dezember noch!
Biber
Biber 08.12.2007 um 23:50:30 Uhr
Goto Top
Moin florengray,

Danke für das Posten Deiner Lösung.
Für mich sieht es jefenfalls eher nach Lösung als nach instabilem Zwischenstand aus.

Den Fortschrittsbalkenthread hab ich ich wieder geöffnet.

Biber,
der heute den Tag in einem Einkaufszentum verbracht hat und dem es wie 5 Tage vorkam
florengray
florengray 09.12.2007 um 15:31:31 Uhr
Goto Top
Hallo Biber,
find ich gut, dass du den Fortschrittsbalken nochmal geöffnet hast!

Ja, die Menschheit betreibt im moment Masseneinkäufe, als ob es ab dem 31. nichts mehr geben würde!