kannwischer
Goto Top

Teile aus ini ersetzen mit Batch-Datei

Hallo zusammen,

habe eine Batch datei geschrieben mit folgendem einfachen inhalt....


xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\ordner\schuler goe\grstamm" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\ordner\Plotter" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\ini" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE" /K/R/I/S/C/H/D


ECHO ... Programmaktualiersung komplett! ...


in dem ordner "ini" befindet sich eine ini-datei von meinem lokalem Laufwerk und ersetzt nun mit dem 3. xcopy die ini-datei im ziel-ordner...


jetzt steht allerdings in meiner original-ini datei "eags_usr.ini" mein domäne-name (graphic_222) in einer variablen zeile....

dateiinhalt von datei "eags_usr.ini"-------
[Environ]
LmUpdateTimer=6000
Order=auftrag
MessageFile=ini/pvapimsg.gr
RpcServer=/.:/tntordsv_thebe0_fkeck
CoeRpc=0
CoeServerName=GRAPHIC_222
CoeServerPort=14321

dieser wert muss ausgetauscht werden durch den domänen-namen des zielrechners....

wie mache ich soetwas ??


Vielen Dank im voraus

Content-ID: 75387

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

Ausgedruckt am: 25.11.2024 um 14:11 Uhr

shorty-xs
shorty-xs 06.12.2007 um 15:56:23 Uhr
Goto Top
Probier mal inifile.exe

http://home.mnet-online.de/horst.muc/wbat32d.htm#inifile

Ich hab ganz gute Erfahrungen damit gemacht. Nutze das als config file für mein Batch Programm.

inifile Laufwerk:pfad\zur\eags_usr.ini [Environ] CoeServerName=%Zielrechner%

Vorher mußt Du natürlich die Variable %Zielrechner% ermitteln. gibt's bestimmt auch einen Batch befehl dafür, fällt mir aber grade nicht ein

Überprüf mal mit "set" ob vielleicht schon eine passende Variable gesetzt ist. z.B. USERDOMAIN, dann kannst Du die auch gleich benutzen.

Greetz
Malte
Kannwischer
Kannwischer 06.12.2007 um 16:03:21 Uhr
Goto Top
danke für die antwort....aber ich wollte schon in der batch datei bleiben....

wäre gut, wenn mir jemand die passende batch-zeile sagen kann.....
shorty-xs
shorty-xs 06.12.2007 um 16:11:15 Uhr
Goto Top
Das was ich Dir oben geschrieben habe kannst Du doch innerhalb der Batch datei so aufrufen. Verstehe Dein Problem nicht. Das geht bestimmt auch nur mir Batch code, wenn Du das meinst aber sehr viel aufwändiger.
Kannwischer
Kannwischer 06.12.2007 um 16:22:19 Uhr
Goto Top
sorry, hatte ich nicht verstanden.....

habs mal eingebaut, aber das funktioniert nicht....kommt immer die fehlermeldung der befehl inifile ist entweder falsch geschrieben oder konnte nicht gefunden werden....


xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\ordner\schuler goe\grstamm" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\ordner\Plotter" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\ini" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE" /K/R/I/S/C/H/D

inifile C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini [Environ] CoeServerName=%Domänenname%

ECHO ... Programmaktualisierung komplett! ...
shorty-xs
shorty-xs 06.12.2007 um 16:46:30 Uhr
Goto Top
Die Datei inifile.exe muß im gleichen Verzeichnis sein wie die Batch Datei.

xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\ordner\schuler goe\grstamm" /K/R/I/S/C/H/D  
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\ordner\Plotter" /K/R/I/S/C/H/D  
xcopy "P:\Datentausch\Buske\ini" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE" /K/R/I/S/C/H/D  

inifile "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" [Environ] CoeServerName=%Domänenname%  

ECHO ... Programmaktualisierung komplett! ...
Ich vermute es liegt daran, dass Du keine Anführungszeichen gesetzt hast, aber Leerstellen in der Verzeichnisstruktur hast.

Es müsste eigentlich auch das hier funktionieren:
xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\ordner\schuler goe\grstamm" /K/R/I/S/C/H/D  
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\ordner\Plotter" /K/R/I/S/C/H/D  
xcopy "P:\Datentausch\Buske\ini" "%userprofile%\Anwendungsdaten\ordner\Schuler GOE" /K/R/I/S/C/H/D  

inifile "%userprofile%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" [Environ] CoeServerName=%Domänenname%  

ECHO ... Programmaktualisierung komplett! ...
Biber
Biber 06.12.2007 um 16:47:58 Uhr
Goto Top
Moin Kannwischer,

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

  • Wenn in dem Ordner "P:\Datentausch\Buske\ini" eine Datei "eags_usr.ini" steht mit o.a. Inhalt und
  • die soll (mit einer geänderten Zeile) nach "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE"

dann.. (nach dem letzten xcopy-Klamauk):

set "iniTargetDir=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE"  
Set "neuerServerName=whatever"  
findstr /v /i "CoeServerName" "P:\Datentausch\Buske\ini\eags_usr.ini" >"%iniTargetDir%\eags_usr.ini"  
echo CoeServerName=%neuerServername%>>"%iniTargetDir%\eags_usr.ini"  

Gruß
Biber
Kannwischer
Kannwischer 07.12.2007 um 07:23:26 Uhr
Goto Top
die lösung mit der Inifile.exe finde ich nicht so gut, denn ich möchte sporadisch die batch-datei per email im haus versenden und von jedem user local aus outlook starten lassen....

Hallo Biber,

danke für deinen Ansatz, habs mal so eingebaut.
die kopierte Datei aus dem 3. Xcopy; da soll nur diese eine Zeile geändert werden.....So wie es jetzt eingebaut ist, wird der gesamte Dateiinhalt gelöscht und durch "CoeServerName=GRAPHIC_22" ersetzt, das darf natürlich nicht....


------------------------------------------------------------------------------
------------------------------------------------------------------------------
xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\Ordner\schuler goe\grstamm" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\Ordner\Plotter" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\ini" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE" /K/R/I/S/C/H/D

set "iniTargetDir=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE"
Set "neuerServerName=%Computername%"
findstr /v /i "CoeServerName" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE\eags_usr.ini" >"%iniTargetDir%\eags_usr.ini"
echo CoeServerName=%neuerServername%>>"%iniTargetDir%\eags_usr.ini"

ECHO ... Programmaktualisierung komplett! ...

pause
------------------------------------------------------------------------------
------------------------------------------------------------------------------

Grüsse
Sascha
shorty-xs
shorty-xs 07.12.2007 um 07:46:17 Uhr
Goto Top
Software Updates per eMail halte ich doch für sehr bedenklich. Dein Outlook ist so eingestellt, dass es Batch Dateien ausführt, und das an jedem Arbeitsplatz?

Na dann fröhliches hacken.

Du solltest Dir mal überlegen das über Softwareverteilung oder im Logon Script durch zu führen, oder per remote vom Admin Platz aus mit den "PSTools".

Das ist wesentlich sicherer.

Greetz
Malte
Kannwischer
Kannwischer 07.12.2007 um 07:57:27 Uhr
Goto Top
outlook filtert natürlich bat-dateien, deshalb muss ich diese immer in einer zip versenden.....

naja und richtige software-updates sind es ja nicht....

auf den localen rechnern fehlen einfach ein paar dateien, die von mir erstellt wurden und nun verteilt werden müssen, und natürlich leider die eine ini.datei, die diese verweise zu den neuen dateien bekommt.... um nicht an die 20 rechner zu gehen und alles von hand zu machen, suche ich die lösung über die batch datei....

wenn das dann funktioniert,werde ich schauen, das ich das unsichtbar für den user anlege über eine batch-datei auf dem server und eine exe-datei im autostart.... aber dazu komm ich erst, wenn das andere problem gelöst ist....
shorty-xs
shorty-xs 07.12.2007, aktualisiert am 18.10.2012 um 18:32:47 Uhr
Goto Top
Naja, PSTools ist jetzt auch keine Hochsicherheitsanwendung, aber kann im Prinziep das was Du möchtest, und zwar ohne dass Du auf den User angewiesen bist.

Kuck mal hier: Silent Installation über das Netzwerk

Du legst einfach eine Textdatei an, in der alle Rechner drin stehen und rufst damit eine batch datei auf einem Network Share auf. Das macht psexec dann auf jedem Rechner. So sparst du Dir sogar das Verschicken der eMail. Der Rechner muß nur an sein und Du brauchst das jeweilige Admin Passwort.

Greetz
Malte
Kannwischer
Kannwischer 07.12.2007 um 08:16:02 Uhr
Goto Top
ja, das wäre eine möglichkeit.....

trotzdem brauche ich noch kurz die lösung zu meinem kleinen fehler....


danke schonmal
stbewo
stbewo 12.12.2007 um 16:04:01 Uhr
Goto Top
Hallo,

ich habe es z.B. so gelöst, dass ich zuerst das ini File aufteile und zwar bis auf die Zeile davor und dahinter.

dateiinhalt von datei "eags_usr1 .ini"-------
[Environ]
LmUpdateTimer=6000
Order=auftrag
MessageFile=ini/pvapimsg.gr
RpcServer=/.:/tntordsv_thebe0_fkeck
CoeRpc=0

dateiinhalt von datei "eags_usr2.ini"-------
CoeServerPort=14321

dann ein zusammenführen mittels

TYPE eags_usr1 .ini > eags_usr .ini
ECHO CoeServerName=GRAPHIC_333 >> eags_usr .ini
und dann wieder ein
TYPE eags_usr2 .ini >> eags_usr .ini

Dann dürfte alles komplett sein.

Gruß
Stefan
Biber
Biber 12.12.2007 um 17:51:36 Uhr
Goto Top
Moin stbewo,

erstmal danke für das Posten Deiner Lösung.

Dennoch: wenn mein Lösungsansatz vom 6.12. nicht funktioniert, dann kann es eigentlich nur daran liegen, dass meine Grundannahmen nicht stimmen.

Damals schrieb ich:
* Wenn in dem Ordner "P:\Datentausch\Buske\ini" eine Datei "eags_usr.ini" steht mit o.a. Inhalt und
  • die soll (mit einer geänderten Zeile) nach "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE"

dann.. (nach dem letzten xcopy-Klamauk):
> set "iniTargetDir=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE"  
> Set "neuerServerName=whatever"  
> findstr /v /i "CoeServerName" "P:\Datentausch\Buske\ini\eags_usr.ini" >"%iniTargetDir%\eags_usr.ini"  
> echo CoeServerName=%neuerServername%>>"%iniTargetDir%\eags_usr.ini"  
> 

Wenn nun die ursprüngliche Ini-Datei nicht in "P:\Datentausch\Buske\ini" liegt, sondern in einer Ordnerebene darunter, dann liefert der Findstr-Befehl bei mir auch nichts.

Nicht dass es wichtig wäre - aber interessieren würde mich natürlich schon, warum etwas nicht funktioniert.
Erst recht, wenn es sich nur um ein paar Zeilen Batch handelt.

Grüße
Biber
Kannwischer
Kannwischer 13.12.2007 um 07:44:29 Uhr
Goto Top
Guten Morgen

also, die ini-Datei soll erst kopiert werden, danach soll die eine Zeile (bzw nur der Domänenname von der konstante "Graphic_222" auf den neuen lokalen Domänennamen geändert werden....diese eine Zeile kann aber an einer beliebigen Stelle in der Datei stehen.

momentan wird die ganze datei gelöscht und durch die eine neue zeile ersetzt, das ist falsch


xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\ordner\schuler goe\grstamm" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\ordner\Plotter" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\ini" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE" /K/R/I/S/C/H/D

set "iniTargetDir=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE"
Set "neuerServerName=%Computername%"
findstr /v /i "CoeServerName" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" >"%iniTargetDir%\eags_usr.ini"
echo CoeServerName=%neuerServername%>>"%iniTargetDir%\eags_usr.ini"


ECHO ... Programmaktualisierung komplett! ...


pause
Biber
Biber 13.12.2007 um 08:40:58 Uhr
Goto Top
Moin Kannwischer,

ich hab Deine Anforderung schon verstanden, glaube ich.
Was ich mein(t)e ist: Wenn hier
 findstr /v /i "CoeServerName" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini"  

...eine leere Datei geschrieben wird, dann wird entweder diese eags_usr.ini gar nicht gefunden oder sie enthält eben keine Zeilen, in denen Nicht "CoeServerName" steht.

Bitte füge doch mal vor der geposteten Zeile ein:
 If not exist "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" (  
Echo Datei "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" nicht gefunden.  
) ELSE (
Echo Gefunden...Inhalt:
Type "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini"  
)

Grüße
Biber
Kannwischer
Kannwischer 13.12.2007 um 13:01:35 Uhr
Goto Top
Hallo Biber,

also er wirft den Inhalt der Datei aus, das heisst also, das er die Datei findet
Biber
Biber 13.12.2007 um 14:29:57 Uhr
Goto Top
Moin Kannwischer,

dann muss ich auch passen... dann seh ich den möglichen Fehler auch nicht mit bloßem Auge..

*ratlos guck*

Grüße
Biber
bastla
bastla 13.12.2007 um 16:06:55 Uhr
Goto Top
Hallo Kannwischer!

Ist es auzuschließen, dass in der Zeile
echo CoeServerName=%neuerServername%>>"%iniTargetDir%\eags_usr.ini"  
nur ein einzelnes ">" anstatt ">>" steht?

Grüße
bastla
Kannwischer
Kannwischer 13.12.2007 um 16:34:04 Uhr
Goto Top
ja, das ist auszuschliessen,

das hier ist der Text:

xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\ordner\schuler goe\grstamm" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\ordner\Plotter" /K/R/I/S/C/H/D
xcopy "P:\Datentausch\Buske\ini" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE" /K/R/I/S/C/H/D

set "iniTargetDir=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE"
Set "neuerServerName=%Computername%"
findstr /v /i "CoeServerName" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" >"%iniTargetDir%\eags_usr.ini"
echo CoeServerName=%neuerServername%>>"%iniTargetDir%\eags_usr.ini"


If not exist "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" (
Echo Datei "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" nicht gefunden.
) ELSE (
Echo Gefunden...Inhalt:
Type "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini"
)


ECHO ... Programmaktualisierung komplett! ...


pause
Kannwischer
Kannwischer 13.12.2007 um 16:36:46 Uhr
Goto Top
kann man nicht direkt nach der Konstante "Graphik_222" suchen und diese durch den domänenname ersetzen ??
Biber
Biber 13.12.2007 um 16:55:27 Uhr
Goto Top
Moin Kannwischer,

so ist die Prüfung aber nicht sonderlich ergiebig - zu dem Zeitpunkt, wo Du prüfst existiert die Datei mit hoher Wahrscheinlichkeit.

Ich meinte vorhin mit "einfügen vor der geposteten Zeile diese Reihenfolge:
xcopy "P:\Datentausch\Buske\dwgs" "C:\Programme\ordner\schuler goe\grstamm" /K/R/I/S/C/H/D  
xcopy "P:\Datentausch\Buske\plotter" "C:\Programme\ordner\Plotter" /K/R/I/S/C/H/D  
xcopy "P:\Datentausch\Buske\ini" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE" /K/R/I/S/C/H/D  

set "iniTargetDir=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE"  
Set "neuerServerName=%Computername%"  

If not exist "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" (  
Echo Datei "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" nicht gefunden.  
) ELSE (
Echo Gefunden...Inhalt:
Type "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini"  
)
pause
findstr /v /i "CoeServerName" "C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini" >"%iniTargetDir%\eags_usr.ini"  
echo CoeServerName=%neuerServername%>>"%iniTargetDir%\eags_usr.ini"  



ECHO ... Programmaktualisierung komplett! ...


pause

Grüße
Biber
bastla
bastla 13.12.2007 um 17:01:15 Uhr
Goto Top
Hallo Kannwischer!

kann man nicht direkt nach der Konstante "Graphik_222" suchen und diese durch den domänenname ersetzen ??
Das hätte wohl nur bei einer Suche nach "GRAPHIC_222" Sinn ... face-wink
... und dann wäre zB "sed" gefragt - oder die folgende Kombination Batch-VBScript:
...
set "iniTargetDir=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\Ordner\Schuler GOE"  
Set "neuerServerName=%Computername%"  
Set "iniSource=C:\Dokumente und Einstellungen\%UserName%\Anwendungsdaten\ordner\Schuler GOE\eags_usr.ini"  

Set "R=%temp%\Repl.vbs"  
echo Set fso=CreateObject("Scripting.FileSystemObject"):Ini=Replace(fso.OpenTextFile("%iniSource%",1).ReadAll, "GRAPHIC_222", "%neuerServername%"):fso.OpenTextFile("%iniTargetDir%\eags_usr.ini",2,True).Write Ini>%R%  
cscript //nologo %R%

Grüße
bastla

[Edit] Script angepasst, sodass Ersetzung auch "inplace" erfolgen kann. [/Edit]
bastla
bastla 13.12.2007 um 17:03:33 Uhr
Goto Top
Übrigens: Täusche ich mich, oder sind Quell- und Zielverzeichnis (und damit auch die jeweiligen Dateien) identisch? Für diesen Fall habe ich die Batch/VBS-Version noch etwas angepasst.

Grüße
bastla
Biber
Biber 13.12.2007 um 17:19:03 Uhr
Goto Top
@bastla
Übrigens: Täusche ich mich, oder sind Quell- und Zielverzeichnis (und damit auch die jeweiligen Dateien) identisch?

Ja. Natürlich.
...so antworte ich prinzipiell auf Oder-Fragen...face-wink

Als ich meinen Lösungsvorschlag (am 06.12.2007 um 16:47:58 Uhr) gemacht habe, habe ich unterstellt,
dass im QUELLverzeichnis ""P:\Datentausch\Buske\ini" eine Datei namens eastereggs.ini (oder so ähnlich) vorliegt.

Und in den ersten wiederkäuenden Versuchen hatte ich auch genau diese mit Findstr.exe gefiltert und auf jeden Fall die eventuell vorhandene im ZIEL-Verzeichnis überschrieben.

Wenn da kein Denkfehler war...

Grüße
Biber
Kannwischer
Kannwischer 17.12.2007 um 14:28:13 Uhr
Goto Top
Vielen Dank für eure Bemühungen, aber leider klappt das alles nicht....

ich werd dann mal weiterhin von Rechner zu Rechner gehen und die Variable abändern...

trotzdem nochmals danke

Gruss
Sascha