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
GELÖST

Variablenproblem set Slashp PNProzentzeichenCVProzentzeichen

Frage Entwicklung Batch & Shell

Mitglied: florengray

florengray (Level 1) - Jetzt verbinden

05.12.2007, aktualisiert 09.12.2007, 3313 Aufrufe, 13 Kommentare

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
Mitglied: Biber
06.12.2007 um 07:17 Uhr
Moin florengray,

das sollte schon gehen, so wie Du es geplant hast.
01.
>for /l %i in (1,1,3) do @set /p "PN%i=pn%i? " 
02.
pn1? eins 
03.
pn2? zwei 
04.
pn3? drei 
05.
 
06.
>set pn 
07.
PN1=eins 
08.
PN2=zwei 
09.
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
Bitte warten ..
Mitglied: florengray
06.12.2007 um 09:53 Uhr
01.
:: Variablen mit %Programmname% werden später an Install.bat übergeben. 
02.
 
03.
echo 0 >%BSL%CVPN.dat 
04.
:nPN 
05.
set /p CV=<%BSL%CVPN.dat 
06.
set /a CV=%CV%+1 
07.
echo %CV% >%BSL%CVPN.dat 
08.
set /p PN=Bitte geben Sie jetzt den %CV%. Programmnamen an: 
09.
rem hier sollte eigentlich das mit dem set /p=PN%CV%=... hin. 
10.
 
11.
echo %CV%.: %PN% >>%BSL%tmp_IRoutinePN.txt 
12.
set /p PNü=Programm Hinzufügen (n) Verlassen (e): 
13.
if %PNü%==n goto nPN 
14.
del %BSL%CVPD.dat 
15.
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.
Bitte warten ..
Mitglied: florengray
06.12.2007 um 12:33 Uhr
OK, das was ich wollte habe ich bis jetzt hingekriegt.
Vielen Dank!
Hier mein Schnipsel:
01.
%BSL% ist hier z.B.:C:\ 
02.
 
03.
echo 0 >%BSL%CVPN.dat 
04.
set CVN=0 
05.
:nPN 
06.
set /p CV=<%BSL%CVPN.dat 
07.
set /a CVN=%CVN% + 1 
08.
set /a CV=%CV%+1 
09.
echo %CV% >%BSL%CVPN.dat 
10.
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 
11.
set /p PNü=Hinzufügen (n) Verlassen (e): 
12.
if %PNü%==n goto nPN 
13.
del %BSL%CVPN.dat 
14.
set AIP=%CV%
Werde das dann noch weiter anpassen.
Aber nochmals vielen Dank!
Bitte warten ..
Mitglied: Biber
06.12.2007 um 12:50 Uhr
Moin florengray,

ich habe Deine Skripte in <code>-Formatierungen gesetzt.

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

Grüße
Biber
Bitte warten ..
Mitglied: florengray
06.12.2007 um 17:29 Uhr
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.
Bitte warten ..
Mitglied: Biber
06.12.2007 um 18:52 Uhr
Moin florengray,

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

01.
@echo off & Setlocal EnableDelayedExpansion 
02.
 
03.
... 
04.
for %%i in (irgendwas) do call :subBlock %%i 
05.
..... 
06.
goto :eof 
07.
 
08.
:SubBlock 
09.
xyz  
10.
set /p "W%1=gib was für W%1 ein: " 
11.
echo Variable W%1 hat den Wert !Wi%1! >>%BSL%Programm.bat 
12.
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
Bitte warten ..
Mitglied: florengray
06.12.2007 um 19:23 Uhr
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!
Bitte warten ..
Mitglied: florengray
06.12.2007 um 21:01 Uhr
Das mit Copyright war wirklich nur´n Scherz!

Ich bitte um Entschuldigung!
War ´n dummer Scherz.

florengray
Bitte warten ..
Mitglied: Biber
06.12.2007 um 21:18 Uhr
*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
Bitte warten ..
Mitglied: florengray
06.12.2007 um 21:52 Uhr
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.
Bitte warten ..
Mitglied: florengray
08.12.2007 um 11:35 Uhr
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!
Bitte warten ..
Mitglied: Biber
08.12.2007 um 23:50 Uhr
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
Bitte warten ..
Mitglied: florengray
09.12.2007 um 15:31 Uhr
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!
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Set-ADUser - Füllen des Felds "Location" funktioniert nicht (2)

Frage von Alex94G zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH: Minuszeichen in set-Befehl (3)

Frage von Schottenrock zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch-Skript für Druckerzuweisung auf Terminalserver - Variablenproblem (3)

Frage von BirdyB zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch-bei set in der Mitte schreiben? (5)

Frage von Jonas1806 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (10)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...