aletri
Goto Top

Vbscript zum Anfügen von Text in scenery.cfg Datei

Guten Tag an alle

Der folgende Script fügt der Scenery.cfg Datei des Flugsimulators einen Szenerie Eintrag hinzu. Das hatte bisher für den FSX auch geklappt.
Für den Prepar3Dv4 habe ich nun die Pfade angepasst...der Eintrag wird ausgeührt aber der Eintrag besteht nun aus vielen Zeichen!?

Hier der Script:

CfgFilePath = "C:\ProgramData\Lockheed Martin\Prepar3D v4\scenery.cfg"   
Scen = "MyScenery"   

Set fs = CreateObject("Scripting.FileSystemObject")   
Set a = fs.OpenTextFile(CfgFilePath, 1, FALSE) 
 
ScenCounter = 0
ScenTitle = "Title=" & Scen   

Do While Not a.AtEndOfStream 
	aLine = a.ReadLine

	AddCounter=Instr(1, aLine, "[Area.")	  
	If 	AddCounter <> 0 Then
		ScenCounter = ScenCounter+1
	End If 

	PosTitle=Instr(1, aLine, ScenTitle)	
	If 	PosTitle <> 0 Then 
		a.Close 
		Set fs = Nothing 
		WScript.Quit
	End If 
	
Loop 

a.Close 

Set a = fs.OpenTextFile(CfgFilePath, 8, FALSE) 

a.WriteLine("[Area." & ScenCounter+1 & "]")   
a.WriteLine(ScenTitle)
a.WriteLine("Layer=" & ScenCounter)  
a.WriteLine("Active=TRUE")  
a.WriteLine("Required=FALSE")  
a.WriteLine("Local=Ecosystem\MyScenery")   
a.WriteLine("Remote=")  
a.WriteLine("")  
a.Close 

Set fs = Nothing 

das Resultat:
[Area.124]
Title=TwentyNine_Palms
Local=Scenery\Cities\TwentyNine_Palms
Layer=124
Active=TRUE
Required=FALSE

[Area.125]
Title=Washington_DC
Local=Scenery\Cities\Washington_DC
Layer=125
Active=TRUE
Required=FALSE

[Area.126]
Title=Bathymetry
Local=Scenery\Bathymetry
Layer=126
Active=TRUE
Required=FALSE

䅛敲⹡崱਍楔汴㵥祍捓湥牥൹䰊祡牥〽਍捁楴敶吽啒൅刊煥極敲㵤䅆卌൅䰊捯污䔽潣祳瑳浥䵜卹散敮祲਍敒潭整ഽഊ

Könnte dies daran liegen, dass die Scenery.cfg Datei von Prepar3Dv4 im UTF-16 Format vorliegt ?
Wie kann ich das lösen?

Besten Dank für Vorschläge

Content-ID: 342286

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

Ausgedruckt am: 24.11.2024 um 08:11 Uhr

Pjordorf
Pjordorf 03.07.2017 um 12:26:15 Uhr
Goto Top
Hallo,

Zitat von @aletri:
Wie kann ich das lösen?
Zeichensatz vorher umstellen bzw. feststellen welcher dar verwendet wird und dann sich auf diesen in dein Skript festlegen. mal mit z.B. Notepadd++ nachschauen.

VBScript Zeichensatz konvertieren
http://www.torsten-horn.de/techdocs/encoding.htm
https://msdn.microsoft.com/de-de/library/windows/desktop/dd317756(v=vs.8 ...
http://www.robvanderwoude.com/vbstech_files_utf8.php

Gruß,
Peter
133417
133417 03.07.2017 aktualisiert um 12:31:38 Uhr
Goto Top
Das Filesystem-Object kann kein UTF verarbeiten. Da musst du eine andere Methode verwenden, z.B. das Einlesen und Beschreiben mit dem ADODB Object:

Hier zwei Functions/Subs dafür:
Sub WriteUTF8(file, txt)
  With CreateObject("ADODB.Stream")  
  	.Type = 2 : .Charset = "UTF-8" : .Open  
  	.WriteText txt
  	.SaveToFile file, 2
  	.Close
  End With
End Sub

Function ReadUTF8(file)
    With CreateObject("ADODB.Stream")  
	.Type = 2 : .Charset = "UTF-8" : .Open : .LoadFromFile(file)  
	ReadUTF8 = .ReadText
	.Close
    End With
End Function
Charset bei Bedarf einfach anpassen.

Gruß
aletri
aletri 03.07.2017 um 14:37:58 Uhr
Goto Top
Hallo Peter besten Dank mal

wie würde es mit einer batch aussehen? Wäre das einfacher zu erstellen?

Habe gleiches Resultat mit Zeichen!!

Hier die batchdatei

setlocal ENABLEDELAYEDEXPANSION 
set "file=C:\ProgramData\Lockheed Martin\Prepar3D v4\Scenery.cfg"   

findstr /i /c:"Title=MyScenery" "%file%">nul || (   
	for /f "tokens=2 delims=.]" %%a in ('type %file%  ^| findstr "Area"') do set /a "var=%%a"   
	set /a var+=1 
	echo.>>"%file%"    
	echo [Area.!var!]>>"%file%"    
	echo Title=MyScenery>>"%file%"    
	echo Layer=!var!>>"%file%"    
	echo Active=TRUE>> "%file%"    
	echo Required=FALSE>> "%file%"    
	echo Local=Ecosystem\MyScenery>>"%file%"    
	echo Remote=>>"%file%"  
)
Pjordorf
Pjordorf 03.07.2017 um 15:03:57 Uhr
Goto Top
rubberman
rubberman 03.07.2017 um 15:06:43 Uhr
Goto Top
Teste mal so:
cmd /q /u /c "echo Blabla">>"%file%"  

Grüße
rubberman
aletri
aletri 06.07.2017 um 12:34:41 Uhr
Goto Top
Grüss Diech rubberman

besten Dank...folgendes passiert:
die "echo Blabla" werden geschrieben aber die [Area.xxx] und Layer nummer bleiben ohne fortlaufend Nummer! Es müsste [Area.127] sein und
Layer=127 !

[Area.126]
Title=Bathymetry
Local=Scenery\Bathymetry
Layer=126
Active=TRUE
Required=FALSE

[Area.]
Title=MyScenery
Local=Ecosystem\MyScenery
Layer=
Active=TRUE
Required=FALSE
114685
114685 06.07.2017 aktualisiert um 15:29:35 Uhr
Goto Top
Hi,

deine Batchdatei funktioniert einwandfrei mit dem Teilbereich[Area.126] der .cfg, angefügt wird [Area.127] usw.

Musst du mal suchen, @echo on am Anfang und pause am Ende der Batch könnte helfen.

Ich bin aber wieder raus.

Gruß
rubberman
rubberman 06.07.2017 aktualisiert um 15:31:29 Uhr
Goto Top
OK, dann kurz zur Erklärung
- cmd /c startet eine neue cmd.exe Instanz
- /q ist für das Ausschalten des Prompts (wie ECHO OFF)
- /u ist für die Ausgabe im Unicode Format (UTF-16), was der eigentliche Grund für die Aktion ist

Was dir noch fehlt ist die verzögerte Variablenerweiterung mit /v:on um Variablen in Ausrufezeichen zu expandieren.
cmd /v:on /q /u /c "echo [Area.!var!]">>"%file%"  

Grüße
rubberman
aletri
aletri 07.07.2017 um 12:34:15 Uhr
Goto Top
Hallo rubberman

1000 Dank... so klappts mit der Area Nummer und der Layer Nummer!
Was jetz nicht funktioniert ist die Abrage ob Szenerie bereits vorhanden und wenn ja, dann Script nicht Ausführen!

Grüsse
aletri
133417
133417 07.07.2017 aktualisiert um 13:27:12 Uhr
Goto Top
Zitat von @aletri:

Hallo rubberman

1000 Dank... so klappts mit der Area Nummer und der Layer Nummer!
Was jetz nicht funktioniert ist die Abrage ob Szenerie bereits vorhanden und wenn ja, dann Script nicht Ausführen!
Tipp: findstr und Errorlevel abfragen face-wink, genau das machst du ja in Zeile 4 deines Codes.
Die Leute lesen ihre eigenen Codes nicht mehr?! Wahrscheinlich wieder Copy n Paster...
aletri
aletri 07.07.2017 um 13:35:18 Uhr
Goto Top
hallo bibersbaum

ja schon..aber wenn man Script wieder ausführt, wird gleicher Eintrag nochmals gemacht! Ergo funktioniert die die Abfrage nicht! oder?
was ist da falsch?

Gruss
aletri
133417
Lösung 133417 07.07.2017 aktualisiert um 13:39:57 Uhr
Goto Top
Das liegt am UTF16, mach ein type des Files und Pipe das an Findstr, und die Codepage nicht vergessen (chcp)
rubberman
Lösung rubberman 07.07.2017 um 13:53:05 Uhr
Goto Top
mach ein type des Files und Pipe das an Findstr
Steht so ja auch schon mal in Zeile 5 face-wink also
type "%file%" | findstr /i /c:"Title=MyScenery">nul || (  

und die Codepage nicht vergessen (chcp)
Das wiederum ist nicht nötig. In der Suchzeichenfolge ist nichts was über 7Bit ASCII hinaus geht. Somit also in jeder Single Byte Codierung gleich ...

Grüße
rubberman
aletri
aletri 08.07.2017 um 08:26:26 Uhr
Goto Top
Guten Morgen rubberman

1000 Dank die Sache mit dem Batchfile hat geklappt.

Grüsse
aletri
aletri
aletri 14.07.2017 um 08:47:18 Uhr
Goto Top
hallo rubberman

Versteh die Welt nicht mehr!! plötzlich passiert, dass beim Ausführen der Batch die Area und der Layer auf 1 statt auf fortlaufende Nummer gesetzt werden; der Script hatte doch tadelllos funktioniert!!? hier der vollständige Script:

setlocal ENABLEDELAYEDEXPANSION 
set "file=C:\ProgramData\Lockheed Martin\Prepar3D v4\Scenery.cfg"   
type "%file%" | findstr /i /c:"Title=MyScenery">nul || (  
	for /f "tokens=2 delims=.]" %%a in ('type %file%  ^| findstr "Area"') do set /a "var=%%a"   
	set /a var+=1 
	cmd /v:on /q /u /c echo [Area.!var!]>>"%file%"  
 	cmd /q /u /c echo Title=MyScenery>>"%file%"  
        cmd /q /u /c echo Local=Ecosystem\Continent\State\xxxxxxxxxxx>>"%file%"     
	cmd /v:on /q /u /c echo Layer=!var!>>"%file%"    
	cmd /q /u /c echo Active=TRUE>> "%file%"    
	cmd /q /u /c echo Required=FALSE>> "%file%"    
)
kannst Du was erkennen, was nicht i.O ist?
Gruss
aletri
Pjordorf
Pjordorf 14.07.2017 um 11:49:05 Uhr
Goto Top
Hallo,

Zitat von @aletri:
plötzlich passiert, dass beim Ausführen der Batch die Area und der Layer auf 1 statt auf fortlaufende Nummer gesetzt werden;
Dann liefer auch gleichzeitig die Datenbasis wo es geht und wo es plötzlich nicht mehr geht. Wir raten uns sonst zu tode für dein Bätchle. Es sind doch immer noch ganze Zahlen, oder?

Gruß,
Peter
aletri
aletri 14.07.2017 um 14:50:02 Uhr
Goto Top
Hallo Peter

ja es sind nur ganze Zahlen! Was meinst Du mit Datenbasis?
rubberman
rubberman 14.07.2017 aktualisiert um 23:21:32 Uhr
Goto Top
Was meinst Du mit Datenbasis?
Den Inhalt der .cfg Datei, bei der dieser Fehler auftritt.

Vermutlich wird die Zeichenfolge "Area" noch in einer anderen Zeile auftreten. Du kannst die Suche noch etwas verfeinern.
for /f "tokens=2 delims=.]" %%a in ('type %file%  ^| findstr /rb "\[Area\.[0-9][0-9]*\]"') do set /a "var=%%a"  
Eine andere Ursache könnte sein, dass es für deine .cfg Dateien keine Rolle spielt ob dort "Area", "area", AREA", ... steht. Für den FINDSTR Befehl müsstest du aber separat festlegen wenn Groß-/Kleinschreibung ignoriert werden soll, bedeutet die Optionen wären dann /rbi statt nur /rb.

Grüße
rubberman
aletri
aletri 15.07.2017 um 18:59:40 Uhr
Goto Top
script sieht nun wie folgt aus:

setlocal ENABLEDELAYEDEXPANSION 
set "file=C:\ProgramData\Lockheed Martin\Prepar3D v4\Scenery.cfg"   
type "%file%" | findstr /i /c:"Title=MyScenery">nul || (  
	for /f "tokens=2 delims=.]" %%a in ('type %file%  ^| findstr /rbi "\[Area\.[0-9][0-9]*\]"') do set /a "var=%%a"  
 	set /a var+=1 
	cmd /v:on /q /u /c echo [Area.!var!]>>"%file%"  
 	cmd /q /u /c echo Title=MyScenery>>"%file%"  
        cmd /q /u /c echo Local=Ecosystem\Continent\State\xxxxxxxxxxx>>"%file%"     
	cmd /v:on /q /u /c echo Layer=!var!>>"%file%"    
	cmd /q /u /c echo Active=TRUE>> "%file%"    
	cmd /q /u /c echo Required=FALSE>> "%file%"    
)

Resultat:
[Area.126]
Title=Bathymetry
Local=Scenery\Bathymetry
Layer=126
Active=TRUE
Required=FALSE

[Area.1] (müsste 127 sein)
Title=MyScenery
Local=Ecosystem\Continent\State\xxxxxxxxxxx
Layer=1 (müsste 127 sein)
Active=TRUE
Required=FALSE
Pjordorf
Pjordorf 15.07.2017 aktualisiert um 19:16:17 Uhr
Goto Top
Hallo,

Zitat von @aletri:
script sieht nun wie folgt aus:
Aha Skript geändert weil es ja läuft face-smile

Resultat:
[Area.126]
Ist das eins deiner Ergebnisse oder was? Ist doch alles OK.

Und bitte was ist in der Quelle drin? Nicht das dort noch irgendwelche ungewünschte Zeichen zuhause sind.
[Area.1] (müsste 127 sein)
Ausgabe oder Eingabe?

Hilfe, mein Auto ist blau, sollte aber rot sein, habe es doch nur Kopiert das grüne das und das Lenkrad ist auch falsch (müsste rund sein)face-smile

Bedenke, wir sind hier Blind und Taub und wissen nicht was du vor dir hast. Wir Vermuten nur...

Gruß,
Peter
rubberman
rubberman 15.07.2017 aktualisiert um 20:29:59 Uhr
Goto Top
Keine Ahnung. Dein Beispiel funktioniert bei mir problemlos, auch wenn ich dir vorgeturnt hatte dass die echo Kommandozeilen in Anführungszeichen zu setzen sind.
Wie Peter schon sagte, wir sehen deinen Monitor nicht. Somit wissen wir nicht, ob die .cfg Datei exakt diesen Inhalt hat, ob die Batchdatei exakt diesen Inhalt hat und auf welche Art das Script ausgeführt wird.

Grüße
rubberman
aletri
aletri 15.07.2017 um 21:51:00 Uhr
Goto Top
Wie kann ich Dir die scenery. cfg zukommen lassen?
rubberman
rubberman 15.07.2017 um 22:51:14 Uhr
Goto Top
Einzippen, bei einem Filehoster deiner Wahl hochladen, Link posten, fertig.
aletri
aletri 16.07.2017 um 08:22:28 Uhr
Goto Top
Guten Morgen rubberman

habs raus: diese Version (die plötzlich nicht mehr ging) funktioniert, solange die scenery.cfg Datei sich nicht im Prepar3d v4 Verzeichnis
befindet!! Hatte für meine Tests die scenery.cfg Datei in anderen Folder kopiert und da funktioniert es tadellos!!

setlocal ENABLEDELAYEDEXPANSION 
set "file=C:\mein pfad\Scenery.cfg"   
type "%file%" | findstr /i /c:"Title=MyScenery">nul || (  
	for /f "tokens=2 delims=.]" %%a in ('type %file%  ^| findstr "Area"') do set /a "var=%%a"   
	set /a var+=1 
	cmd /v:on /q /u /c echo [Area.!var!]>>"%file%"  
 	cmd /q /u /c echo Title=MyScenery>>"%file%"  
        cmd /q /u /c echo Local=Ecosystem\Continent\State\xxxxxxxxxxx>>"%file%"     
	cmd /v:on /q /u /c echo Layer=!var!>>"%file%"    
	cmd /q /u /c echo Active=TRUE>> "%file%"    
	cmd /q /u /c echo Required=FALSE>> "%file%"    
)

Führe ich diese Batch (mit Prepar3d v4 Verzeichnis) im cmd Fenster aus kommt folgende Meldung:
setlocal ENABLEDELAYEDEXPANSION 
set "file=C:\ProgramData\Lockheed Martin\Prepar3D v4\Scenery.cfg"   
type "%file%" | findstr /i /c:"Title=MyScenery">nul || (  
	for /f "tokens=2 delims=.]" %%a in ('type %file%  ^| findstr "Area"') do set /a "var=%%a"   
	set /a var+=1 
	cmd /v:on /q /u /c echo [Area.!var!]>>"%file%"  
 	cmd /q /u /c echo Title=MyScenery>>"%file%"  
        cmd /q /u /c echo Local=Ecosystem\Continent\State\xxxxxxxxxxx>>"%file%"     
	cmd /v:on /q /u /c echo Layer=!var!>>"%file%"    
	cmd /q /u /c echo Active=TRUE>> "%file%"    
	cmd /q /u /c echo Required=FALSE>> "%file%"    
)
"The system cannot find the file specified.
Error occurred while processing: C:\ProgramData\Lockheed.
The system cannot find the path specified."

Die scenery.cfg wird aber trotzdem beschrieben aber die Area und der Layer werden
nicht weiter nummeriert !!
rubberman
Lösung rubberman 16.07.2017 aktualisiert um 12:28:30 Uhr
Goto Top
Zeile 4
('type "%file%" ^|
statt
('type %file% ^|

Grüße
rubberman
aletri
aletri 16.07.2017 um 13:47:02 Uhr
Goto Top
Hallo rubberman
Jetzt klappts auch mit der p3d Directory!
Tausend Dank
Pjordorf
Pjordorf 16.07.2017 um 23:02:50 Uhr
Goto Top
Hallo,

Zitat von @aletri:
Jetzt klappts auch mit der p3d Directory!
Nur für dein Verständniss. Es sind die Leerzeichen im Pfadnamen an dennen es happerte. Das siehst du auch aufgrund deiner genauen Fehlermeldung von dir
Error occurred while processing: C:\ProgramData\Lockheed
Nämlich ab dem Leerzeichen muckt deine Batch eben weil es ohne den Hochkommatas nicht mit Leerzeichen umgehen kann. Ist normal.

Du merkst, je mehr Infos kommen je schneller finden sich Bugs face-smile

Gruß,
Peter