saschato
Goto Top

Variable in eine andere Datei schreiben

Hallo zusammen.

Erstmal mein Beispiel:

ECHO OFF
Find /i "Username=" test.txt
if errorlevel 1 goto notfound
set /p testvar=
:notfound

So geht es leider nicht:

ECHO OFF
Find /i "Username=" test.txt
if errorlevel 1 goto notfound
set /p testvar=
ECHO %testvar% Find /i "Username=%testvar%" test.txt >> test.txt
:notfound

Ich möchte die Variable %testvar% in eine andere Datei schreiben. In dieser Datei soll "Username=" durch die Eingabe ergänzt werden. Also "Username=eingabe" Wie ist das möglich? Vielen Dank für eure Antworten.

Content-Key: 64750

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

Printed on: April 25, 2024 at 22:04 o'clock

Member: bastla
bastla Jul 26, 2007 at 10:30:45 (UTC)
Goto Top
Hallo saschato und willkommen im Forum!

Darf ich Deine Frage so interpretieren, dass es in der Zieldatei bereits eine Zeile "Username=" gibt, die auf "Username=Inhalt von %testvar%" geändert werden soll? Und falls ja, soll diese Zeile vermutlich an der selben Position innerhalb der Datei bleiben und nicht erst am Ende angefügt werden?

In diesem Fall könnte der relevante Teil des Batches etwa so aussehen:
set /p testvar=
for /f "delims=" %%i in (test.txt) do echo %%i|findstr /b "Username=">nul && echo Username=%testvar%>>testneu.txt || echo %%i>>testneu.txt  
move testneu.txt test.txt

Hilfreich wäre es natürlich, wenn Du Näheres zum weiteren Inhalt der "test.txt" bekanntgeben würdest. Wären etwa Leerzeilen, die erhalten bleiben müssen, vorhanden, reicht diese knappe Variante nicht aus ...

Grüße
bastla
Member: saschato
saschato Jul 26, 2007 at 11:17:02 (UTC)
Goto Top
Super bin schonmal auf dem Richtigen wege! Danke dir nur noch ein Problem meine Datei heisst AppRegUpdate.pdb und das Format sieht so aus:

H S T   P F   S T A T   G E N H E L P G E N N A C N G E N D C T N H S T / D E F F M X M P 0 1 O B M G : 5 0 0 1 : 0 R C N T 1 H S T / D E F X M X M P 0 5 O B M G : 5 0 0 1 : 0 H O S T K E Y P F C T T 1 X F C U R 0 P F H N D 1 0 0 0 0 0 P F D e f a u l t 0 P F / 0 C N C H P S N P F / 0 C N S V P S Y P F / 0 H S T D E F F M X X P 0 5 O B M G : 5 0 0 1 : 0 P F / 0 M E T H A c t i v e S y n c L i n k P F / 0 P N M D e f a u l t P F / 0 S S O Y P F / 0 S V P S Y P F / 0 U S R @ t e s t . c o m  O P E N P I M C F G P F   P F / 0 / C T C N T 0 P F / 0 / N D C N T 0 P F / 0 P N M D e f a u l t P F C N T 1 P F C U R D e f a u l t P F D e f a u l t 0 P F H N D S 1 0 0 0 0 0 0 0  C L O S E P I M C F G

Habe deinen Vorschlag nun so editiert:

ECHO OFF
Find /i "U S R @ c o g n i s . c o m" AppRegUpdate.pdb
if errorlevel 1 goto notfound
set /p testvar=
move testneu.txt AppRegUpdate.pdb
:notfound

So nun ist meine Variable die ich Eingebe aber ohne die Leerzeichen also test@test.com und nicht t e s t @ t e s t . c o m Hättest du noch eine Idee wie ich das hinbekomme? Dann hättest du mir wirklich total geholfen. Vielen Dank
Member: bastla
bastla Jul 26, 2007 at 11:59:03 (UTC)
Goto Top
Hallo saschato!

Versuch es mal so:
set /p "testvar=Adresse eingeben_"  
Den Text nach dem "=" kannst Du natürlich auch weglassen, wichtig ist nur das schließende Anführungszeichen.

Grüße
bastla
Member: saschato
saschato Jul 26, 2007 at 12:02:05 (UTC)
Goto Top
Nun habe ich nach dem String ein Leerzeichen aber leider nicht zwischen jedem Buchstaben.
Member: bastla
bastla Jul 26, 2007 at 12:05:39 (UTC)
Goto Top
Hallo saschato!

Wenn Du die Leerzeichen eingibst, müssten sie auch rausgeschrieben werden (funktioniert zumindest bei mir so).

Grüße
bastla
Member: saschato
saschato Jul 26, 2007 at 12:07:24 (UTC)
Goto Top
Das Funktioniert bei mir auch. Aber leider ist das Batch für User gedacht und das zu Erklären ist zu kompliziert die sollen einfach normal ihre E-Mail Adresse eintragen. Also muss ich das Format im Batch ändern.
Member: bastla
bastla Jul 26, 2007 at 12:22:16 (UTC)
Goto Top
Hallo saschato!

Eigentlich wind wir damit schon bei einer ganz anderen Frage angelangt ...

Ersetze die Eingabezeile durch:
set "Ein=%temp%\Eingabe.vbs"  
echo A=InputBox("Bitte Mailadresse eingeben!"):For i=1 To Len(A):B=B^&Mid(A,i,1)^&" ":Next:WScript.Echo B>"%Ein%"  
for /f "delims=" %%i in ('cscript //nologo "%Ein%"') do set "tempvar=%%i"  
del "%Ein%"  

So finde ich's auch schöner ... face-wink

Grüße
bastla
Member: saschato
saschato Jul 26, 2007 at 12:36:39 (UTC)
Goto Top
Danke für deine Antwort nur wo wird das nun gespeichert? Sorry bin nicht so fit im Programmieren. sorry hab es hinbekommen. Vielen Dank
Member: saschato
saschato Jul 26, 2007 at 12:44:10 (UTC)
Goto Top
So die letzte Frage an dich hoffentlich face-smile Vielen dank übrigens !!! momentan wird U S R =eingabe ich brauche aber doch USR eingabe also ohne gleich welches ist das in deinem code?

ICH HAB ES GESCHAFFT face-smile
Member: bastla
bastla Jul 26, 2007 at 12:56:34 (UTC)
Goto Top
Hallo saschato!

Das freut. face-smile

Grüße
bastla
Member: saschato
saschato Jul 26, 2007 at 13:50:47 (UTC)
Goto Top
Hallo bastla gibt es die Möglichkeit das ich dir die AppRegUpdate.pdb mal zusende? Er findet den String nicht da die Datei so ein komisches Format hat. Melde dich doch mal wäre nett. Vielen Dank
Member: Biber
Biber Jul 26, 2007 at 17:42:23 (UTC)
Goto Top
Moin saschato,

ich würde da nicht so einen Heckmeck von machen...

Wenn Deine AppRegUpdate.pdb wirklich so aussieht oder zumindest so beginnt wie oben gepostet, dann kannst Du
  • Deine Variable OHNE Leerzeichen vom Benutzer eingeben lassen
  • in den Dateien AppRegUpdate.pdb und text.txt wie folgt prüfen:

[Demo am CmdPrompt]
(=19:28:08  D:\temp=)
>set /p pdbInhalt=<AppRegUpdate.pdb

(=19:28:12  D:\temp=)
>echo %pdbinhalt: =%|find /i "USR@test.com">nul && @echo Ja, USR@test.com gefunden  
Ja, USR@test.com gefunden

Die einzigen neuen Details, die ich reingebracht habe sind..
1.---> set /p pdbInhalt=<AppRegUpdate.pdb
Liest den Inhalt einer Datei bis zum ersten CRLF/Zeilenumbruch ODER zum ersten 0x00
2.---> echo %pdbinhalt: =%
Ersetze in der Variablen %pdbInhalt% alle Leerzeichen durch nichts.
[3. ---> echo %pdbinhalt: =%|find /i "USR@test.com"
Diesen Test 3. solltest Du zur Kontrolle am CMD-Prompt machen...]

Wir müssen doch nicht immer mit so großen Kanonen auf so kleine Spatzen usw. usw....

Grüße
Biber
Member: bastla
bastla Jul 26, 2007 at 17:54:22 (UTC)
Goto Top
@Biber

Wir müssen doch nicht immer mit so großen Kanonen auf so kleine Spatzen...
... ist allerdings ein größerer Vogel: Die Leerstellen sind in Wirklichkeit Chr(0), und diverse Chr(4) sind auch noch eingestreut (insgesamt schaut's nach Unicode aus, womit ich mich bisher allerdings noch nicht herumgeschlagen hatte).

Die eingegebene Adresse soll ebenfalls nach jedem Zeichen ein Chr(0) bekommen und der Rest muss natürlich auch in diesem Format bleiben.

Ich bastle gerade an einem VBScript, das dann hoffentlich auch diesen Vogel abschießen wird. face-wink

Grüße
bastla
Member: Biber
Biber Jul 26, 2007 at 18:08:44 (UTC)
Goto Top
Moin bastla,

ich hatte es fast befürchtet... ich habe ja nur mit dem im Forum geposteten Ausschnitt der .pdb-Datei gespielt.
Und dort sind dann wohl alle Chars < 32 und <> 9 zu Spaces konvertiert worden.

Na ja.... dann nehmen wir halt ein professionelleres Kaliber.. *Vortritt lass*

Schönen Abend
Biber
Member: bastla
bastla Jul 26, 2007 at 18:22:45 (UTC)
Goto Top
@Biber

... ein professionelleres Kaliber..
Dass noch jemand mit sowas vorbeikommt, wage ich eigentlich nicht zu hoffen, also werd' doch ich es machen (mit meinem Amateur-VBS, und hoffentlich noch bevor ich mein ganzes Pulver verschossen habe face-wink).

Grüße
bastla
Member: bastla
bastla Jul 26, 2007 at 19:14:12 (UTC)
Goto Top
Hallo saschato!

Auf Basis der mir übermittelten "AppRegUpdate.pdb" sollte das folgende VB-Script den Eintrag einer neuen Mail-Adresse bewerkstelligen:

AppRegUpdate-Patch.vbs
sBegin = Replace("U S R   @ c o g n i s . c o m ", " ", Chr(0))'Platzhalter für Chr(0) sind Leerstellen  
iLen = Len(sBegin)

If WScript.Arguments.Count < 1 Then
	MsgBox "Zu bearbeitende Datei mit vollständigem Pfad als Argument übergeben!", vbCritical  
	WScript.Quit(1)
End If
sFile = WScript.Arguments(0)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")  
If Not fso.FileExists(sFile) Then
	MsgBox "Datei wurde nicht gefunden - bitte mit vollständigem Pfad angeben!", vbCritical  
	WScript.Quit(1)	
End If
sFileNameWithExt = fso.GetFile(sFile).Name
If InstrRev(sFileNameWithExt, ".") Then  
	sFileName = Left(sFileNameWithExt, InstrRev(sFileNameWithExt, ".") - 1)  
Else
	sFileName = sFileNameWithExt
End If
sOldFile = sFile & ".bak"  
sOldFileName = sFileNameWithExt & ".bak"  

'gesamte Datei in binDataOld einlesen  
lSize = fso.GetFile(sFile).Size
Set oOldFile = fso.OpenTextFile(sFile, 1)
binDataOld = oOldFile.Read(lSize)
oOldFile.Close
If Instr(binDataOld, sBegin) Then 'String gefunden  
	'Eingabe Mailadresse  
	sMailAdr = InputBox("Bitte Mailadresse eingeben!")  
	Do 'Ein wenig auf Plausibilität prüfen ...  
		ok = True
		If sMailAdr = "" Then 'Keine Eingabe bzw Abbruch  
			MsgBox "Bearbeitung abgebrochen!", vbExclamation  
			WScript.Quit(1) 
		End If
		P1 = Instr(sMailAdr, "@")  
		If P1 <=1 Then
			ok = False
		Else
			P2 = InstrRev(sMailAdr, ".")  
			If P2 < (P1 + 3) Then ok = False
		End If
		If Not ok Then sMailAdr = InputBox("Bitte eine gültige Mailadresse eingeben!")  
	Loop Until ok

	'Mailadresse umformatieren  
	For i = 1 To Len(sMailAdr)
		sReplace = sReplace & Mid(sMailAdr, i, 1) & Chr(0)
	Next
	
	//'ev bereits vorhandene Sicherungskopie löschen 
	If fso.FileExists(sOldFile) Then fso.DeleteFile(sOldFile)
	
	'Datei umbenennen (als Sicherungskopie behalten)  
	Set oOldFile = fso.GetFile(sFile)
	oOldFile.Name = sOldFileName//
		
	'neue Datei erstellen  
	Set oNewFile = fso.OpenTextFile(sFile, 2, True)
	oNewFile.Write Replace(binDataOld, sBegin, sReplace, 1, 1)
	oNewFile.Close
	MsgBox "Adresse eingetragen!"  
Else
	MsgBox "Datei enthält nicht die erforderliche Kennung!", vbCritical  
End If

Speichere das Script zB unter "C:\Scripts\Eintragen.vbs". Verwenden kannst Du es am einfachsten, indem Du die Datei "AppRegUpdate.pdb" auf die Script-Datei oder eine Verknüpfung zu dieser ziehst. Alternativ kann es auch aus einem Batch wie folgt gestartet werden:
"C:\Scripts\Eintragen.vbs" "D:\AppRegUpdate.pdb"  
In beiden Fällen wird nach einer Mail-Adresse gefragt, diese (oberflächlich) geprüft ("@" enthalten, folgt nach "@" im Abstand von mehr als 2 Zeichen noch ein ".") und in die Ausgangsdatei integriert. Die Originaldatei wird dabei als "AppRegUpdate.pdb.bak" im gleichen Ordner belassen. Falls dies nicht gewünscht sein sollte, einfach die kursiv formatierten Zeilen entfernen.

Grüße
bastla

P.S.: Da derzeit die Code-Formatierung des Forums nicht ordnungsgemäß funktioniert, habe ich den Script-Code auf 3 Blöcke aufgeteilt - diese bitte im Editor zusammenfügen.
Member: saschato
saschato Jul 27, 2007 at 08:12:55 (UTC)
Goto Top
Hallo Bastla Vielen Dank,

Nur leider kommt bei dir Fehlermeldung "Datei enthält nicht die erforderliche Kennung!" Noch ne Ahnung woran das liegen kann?
Member: bastla
bastla Jul 27, 2007 at 09:23:27 (UTC)
Goto Top
Hallo saschato!

Es wird überprüft, ob
U S R @ c o g n i s . c o m
in der Datei enthalten ist, da ja dieser Teil ersetzt werden soll. Mit der "AppRegUpdate.pdb" aus Deiner Mail funktioniert es - sobald allerdings eine andere Mail-Adresse eingetragen ist, wird eben die Kennung nicht mehr gefunden.

Grüße
bastla
Member: saschato
saschato Jul 27, 2007 at 09:24:13 (UTC)
Goto Top
Ja das hab ich gelöst hab dir noch per E-Mail ne Fehlermeldung gesendet die jetzt kommt wenn es gefunden wird.
Member: saschato
saschato Jul 27, 2007 at 10:28:23 (UTC)
Goto Top
Vielen Vielen Dank an bastla. So einen hilfsbereiten User in einem Forum hab ich noch nie gefunden! Er hat mir sehr geholfen und nun Funktioniert es face-smile Ein Schönes Wochenende wünsch ich dir und falls du mal fragen in Richtung Mobility hast bin ich für die da face-smile Bye
Member: saschato
saschato Jul 27, 2007 at 10:42:08 (UTC)
Goto Top
Hi Bastla,

Ich schon wieder face-smile Ist es noch möglich das dein Script prüft ob die Datei AppRegUpdate.pdb.bak verfügbar ist und wenn ja es nicht ausgeführt wird ? Weil wenn es nun mehrfach ausführe gibt es Probleme. Danke dir
Member: bastla
bastla Jul 27, 2007 at 13:19:32 (UTC)
Goto Top
Hallo saschato!

Eigentlich sollte beim zweiten Durchlauf die Kennung ja ohnehin nicht mehr gefunden werden ...

Unabhängig davon müsstest Du aber nur den folgenden fetten Teil zwischen den unfetten Zeilen einfügen:
sOldFileName = sFileNameWithExt & ".bak"  

<b>If fso.FileExists(sOldFile) Then
	MsgBox "Datei wurde bereits bearbeitet!", vbCritical  
	WScript.Quit(1)	
End If</b>

'gesamte Datei in binDataOld einlesen  

Grüße
bastla