gordons
Goto Top

Mit einer Batch Text in andere Batchdateien einfügen

Hallo,

vorab schon einmal Danke für eure Mühe face-smile

Ich brauche eigentlich nur eine kleine Batchdatei, mit der ich einen bestimmten Text (abc), in eine andere Batchdatei einfügen kann.

Kurze Erläuterung:

wir haben eine "user.bat" welche beim Systemstart jedes Benutzers ausgeführt wird und die Netzlaufwerke verbindet, die User.bat können zum Teil unterschiedlich sein( versch. Laufwerke etc). Nun möchte ich einen weiteren Befehl am Ende der Batch hinzufügen, da ich das aber nicht > 100mal per Hand eintragen möchte, brauche ich eine Batch die das für mich erledigt, desweiteren wird das auch nicht das letzte Mal sein das etwas an allen user.bat Dateien geändert werden muss. Nun kommt mein eigentliches Problem die Batch Dateien sind in versch. Ordnern (Bsp: Netzlaufwerk/Schmitt, Netzlaufwerk/Müller, Netzlaufwerk/Baum etc).

Vielen Dank

Mit freundlichen Grüßen

Klaus Fischer

Content-Key: 195672

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

Printed on: April 16, 2024 at 13:04 o'clock

Member: Hitman4021
Hitman4021 Dec 11, 2012 at 12:49:16 (UTC)
Goto Top
Hallo,

nur mal so als Idee.

Du legst dir auf C:\Login.txt eine Liste mit den Pfaden zu allen Login Scripts an.
Dann nimmst du dir eine Batch File die ca. so aussieht (ungetestet und @bastla wird sicher bald eine schönere Variante posten)
@ECHO OFF && setlocale
FOR /F %%p IN (C:\Login.txt) DO (
    echo "BESTIMMTER TEXT" >> %%p  
)

Gruß
Member: GordonS
GordonS Dec 11, 2012 updated at 13:01:16 (UTC)
Goto Top
Danke, zumindest schonmal eine Idee, falls gar nichts mehr geht face-smile

Anbei meine ersten Versuche:

Aus anderen Fragestellungen zusammengebaut.. funktioniert natürlich nicht...

@ echo off
FOR /F "delims=*" %%A IN ('dir /b /s user.bat') do (
echo abc>>user.bat
Member: Hitman4021
Hitman4021 Dec 11, 2012 updated at 13:11:44 (UTC)
Goto Top
Hallo,

Zitat von @GordonS:
Danke, zumindest schonmal eine Idee, falls gar nichts mehr geht face-smile

Anbei meine ersten Versuche:

Aus anderen Fragestellungen zusammengebaut.. funktioniert natürlich nicht...
For Schleifen sind nicht deins oder? ;)
Innerhalb der Schleife benutzt du die Variable "%%A".
Und du musst den Anweisungsblock immer schließen.
Und warum hast du ein Trennzeichen (delims=*) eingebaut?

Also könnte deine Datei so etwa funktionieren
@ echo off && setlocal
FOR /F %%A IN ('dir /b /s user.bat') do (  
    echo "DEIN TEXT" >> %%A  
)

Hier kannst du sonst auch nachschauen, die Seite ist relativ gut.
http://de.wikibooks.org/wiki/Batch-Programmierung:_Batch-Befehle

Gruß

PS.: Und bitte die < code > < /code > Tags benützen. Ohne Leerzeichen
Member: GordonS
GordonS Dec 11, 2012 at 13:57:06 (UTC)
Goto Top
Yuhuu es funktioniert!

Was jetzt noch sehr nützlich wäre, wenn der Batch vorher überprüft ob der Text evtl. schon vorhanden ist.
Falls ja = nichts machen
Falls nein = rein schreiben
Member: Hitman4021
Hitman4021 Dec 11, 2012 updated at 14:08:59 (UTC)
Goto Top
Hallo,

@ echo off && setlocal
FOR /F %%A IN ('dir /b /s user.bat') do (  
    findstr "DEIN TEXT" %%A && set vorhanden=TRUE  
    if "%vorhanden%" == "TRUE" (  
    echo "DEIN TEXT" >> %%A  
    ) else (
    echo "Schon vorhanden"  
    )
)
So in etwa?

Gruß
Member: Friemler
Friemler Dec 11, 2012, updated at Dec 16, 2012 at 11:52:13 (UTC)
Goto Top
Hallo Hitman,

nee, nee, so wird dat nüscht. face-wink Du hast da die Besonderheiten beim Erweitern von Variablen seitens des Batchscript-Interpreters und einige andere gemeine Details ausser Acht gelassen.

Die Variable vorhanden wird innerhalb der FOR-Schleife verändert und verwendet, ohne die verzögerte Variablenerweiterung einzuschalten (setlocal enabledelayedexpansion) und zu nutzen (statt %vorhanden% schreibt man dann !vorhanden!).

Das ist aber auch garnicht nötig, es geht auch per bedingte Befehlsausführung:
@echo off & setlocal

set "BaseDir=Startverzeichnis"  
set "BatchFile=user.bat"  
set "SearchStr=Dein Text"  

for /f "delims=" %%a in ('dir /s /b "%BaseDir%\%BatchFile%" 2^>NUL') do (  
  findstr /i /c:"%SearchStr%" "%%a" 1>NUL 2>NUL || (  
    >>"%%a" (set /p "=%SearchStr%" <NUL & echo.)  
  )
)

Der SET-Befehl in Zeile 9 dient der Ausgabe des gewünschten Textes in die Datei. Durch das Einschließen des Textes (in der Variablen SearchStr) in Anführungszeichen kann der Text auch Zeichen enthalten, die zum Sprachumfang von Batchscript gehören, ohne dass der Batchscript-Interpreter ins Trudeln kommt. In einigen Fällen kann das trotzdem passieren, deshalb benutze ich für solche Anwendungsfälle lieber VBScript.

Die Option "delims=" sollte man beim Verarbeiten von unbekannten Pfaden/Dateinamen durch eine FOR-Schleife immer benutzen, sonst kommt es bei Pfaden/Dateinamen, die Leerzeichen enthalten, zu einem "Datei nicht gefunden"-Fehler (Leerzeichen sind die Standard-Trennzeichen für den Tokenizer der FOR-Schleife), der ohne das 2^>NUL hinter dem DIR-Befehl auch dazu führen würde, dass die FOR-Schleife im Fehlerfall ausgeführt wird - die Laufvariable hätte dann eben den Wert "Datei" und diese Datei würde dann der FINDSTR-Befehl in der Schleife wiederum garantiert nicht finden.

Damit der FINDSTR-Befehl auch dann brav nach dem Suchbegriff als ganzem sucht, wenn der Suchbegriff Leerzeichen enthält, ist der Suchbegriff hinter dem Parameter /c: angegeben. Ansonsten interpretiert FINDSTR durch Leerzeichen separierte Wörter als eine Liste von Suchbegriffen => Ist einer davon in der zu durchsuchenden Datei vorhanden, liegt ein Treffer vor.

Die Ausgaben und Fehlermeldungen von FINDSTR interessieren nicht, deshalb wird mit 1>NUL die Standardausgabe und mit 2>NUL der Standardfehlerkanal ins Nirvana umgeleitet.

Wenn beim Suchbegriff Groß-/Kleinschreibung unterschieden werden soll, muss der Parameter /i beim FINDSTR-Befehl entfernt werden.


Gruß
Friemler
Member: GordonS
GordonS Dec 12, 2012 at 09:44:53 (UTC)
Goto Top
Hallo Friemler,

vielen Dank für deine wahnsinnig gute Erklärung. Aber leider mach ich wohl immer noch was falsch.

Ich lege diese Batch (Test.bat) in mein Netzlaufwerk(L:/Netzlaufwerk/Test.bat), wo auch die Userordner inkl. user.bat(L:/Netzlaufwerk/Schmitt/user.bat) liegen.

@echo off & setlocal

set "BaseDir=Startverzeichnis"  
set "BatchFile=user.bat"  
set "SearchStr=q:\edv\erstinstallation\bginfo\bginfo.exe q:\edv\erstinstallation\bginfo\td.bgi /TIMER:00"  

for /f "delims=" %%a in ('dir /s /b "%BaseDir%\%BatchFile%" 2>NUL') do (  
  findstr /i /c:"%SearchStr%" "%%a" 1>NUL 2>NUL || (  
    >>"%%a" (set /p "=%SearchStr%" <NUL & echo.)  
  )
)
Member: Friemler
Friemler Dec 12, 2012 at 16:09:54 (UTC)
Goto Top
Hallo Klaus,

Deine Zeile 3 muss
set "BaseDir=L:\Netzlaufwerk"
lauten. Oder hast Du nur vergessen, es in Deinem Posting anzupassen?

Gruß
Friemler
Member: GordonS
GordonS Dec 13, 2012 at 07:05:44 (UTC)
Goto Top
Hallo Friemler,

hatte es lediglich vergessen im Posting anzupassen.

Gruß
GordonS
Member: Friemler
Friemler Dec 13, 2012 updated at 15:49:15 (UTC)
Goto Top
Hallo Klaus,

sorry, da ist mir das "Escapen" des > -Zeichens im Kopf der FOR-Schleife durch die Lappen gegangen. face-sad

Hier also nochmal die funktionierende Version:
@echo off & setlocal

set "BaseDir=L:\Netzlaufwerk"  
set "BatchFile=user.bat"  
set "SearchStr=q:\edv\erstinstallation\bginfo\bginfo.exe q:\edv\erstinstallation\bginfo\td.bgi /TIMER:00"  

for /f "delims=" %%a in ('dir /s /b "%BaseDir%\%BatchFile%" 2^>NUL') do (  
  findstr /i /c:"%SearchStr%" "%%a" 1>NUL 2>NUL || (  
    >>"%%a" (set /p "=%SearchStr%" <NUL & echo.)  
  )
)

Gruß
Friemler
Member: GordonS
GordonS Dec 13, 2012, updated at Dec 14, 2012 at 10:57:02 (UTC)
Goto Top
Hallo Friemler,

brauchst dich für nichts zu entschuldigen, du hilfst mir sehr weiter. Danke nochmal.
Werde es morgen ausprobieren und dir ein Feedback geben ob es nun funktioniert.

edit 13.12.12

Hat wunderbar funktioniert.

Vielen Dank für eure Hilfe!!