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-Key: 342286

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

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

Member: Pjordorf
Pjordorf Jul 03, 2017 at 10:26:15 (UTC)
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
Mitglied: 133417
133417 Jul 03, 2017 updated at 10:31:38 (UTC)
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ß
Member: aletri
aletri Jul 03, 2017 at 12:37:58 (UTC)
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%"  
)
Member: Pjordorf
Pjordorf Jul 03, 2017 at 13:03:57 (UTC)
Goto Top
Member: rubberman
rubberman Jul 03, 2017 at 13:06:43 (UTC)
Goto Top
Teste mal so:
cmd /q /u /c "echo Blabla">>"%file%"  

Grüße
rubberman
Member: aletri
aletri Jul 06, 2017 at 10:34:41 (UTC)
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
Mitglied: 114685
114685 Jul 06, 2017 updated at 13:29:35 (UTC)
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ß
Member: rubberman
rubberman Jul 06, 2017 updated at 13:31:29 (UTC)
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
Member: aletri
aletri Jul 07, 2017 at 10:34:15 (UTC)
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
Mitglied: 133417
133417 Jul 07, 2017 updated at 11:27:12 (UTC)
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...
Member: aletri
aletri Jul 07, 2017 at 11:35:18 (UTC)
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
Mitglied: 133417
Solution 133417 Jul 07, 2017 updated at 11:39:57 (UTC)
Goto Top
Das liegt am UTF16, mach ein type des Files und Pipe das an Findstr, und die Codepage nicht vergessen (chcp)
Member: rubberman
Solution rubberman Jul 07, 2017 at 11:53:05 (UTC)
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
Member: aletri
aletri Jul 08, 2017 at 06:26:26 (UTC)
Goto Top
Guten Morgen rubberman

1000 Dank die Sache mit dem Batchfile hat geklappt.

Grüsse
aletri
Member: aletri
aletri Jul 14, 2017 at 06:47:18 (UTC)
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
Member: Pjordorf
Pjordorf Jul 14, 2017 at 09:49:05 (UTC)
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
Member: aletri
aletri Jul 14, 2017 at 12:50:02 (UTC)
Goto Top
Hallo Peter

ja es sind nur ganze Zahlen! Was meinst Du mit Datenbasis?
Member: rubberman
rubberman Jul 14, 2017 updated at 21:21:32 (UTC)
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
Member: aletri
aletri Jul 15, 2017 at 16:59:40 (UTC)
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
Member: Pjordorf
Pjordorf Jul 15, 2017 updated at 17:16:17 (UTC)
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
Member: rubberman
rubberman Jul 15, 2017 updated at 18:29:59 (UTC)
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
Member: aletri
aletri Jul 15, 2017 at 19:51:00 (UTC)
Goto Top
Wie kann ich Dir die scenery. cfg zukommen lassen?
Member: rubberman
rubberman Jul 15, 2017 at 20:51:14 (UTC)
Goto Top
Einzippen, bei einem Filehoster deiner Wahl hochladen, Link posten, fertig.
Member: aletri
aletri Jul 16, 2017 at 06:22:28 (UTC)
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 !!
Member: rubberman
Solution rubberman Jul 16, 2017 updated at 10:28:30 (UTC)
Goto Top
Zeile 4
('type "%file%" ^|
statt
('type %file% ^|

Grüße
rubberman
Member: aletri
aletri Jul 16, 2017 at 11:47:02 (UTC)
Goto Top
Hallo rubberman
Jetzt klappts auch mit der p3d Directory!
Tausend Dank
Member: Pjordorf
Pjordorf Jul 16, 2017 at 21:02:50 (UTC)
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