Windows 2003 Shell Scripting

Scripts zur System- und Dateiverwaltung

Insert - Einfügen von Inhalten

An eine Textdatei Inhalt anzufügen, gehört zu den leichteren Übungen (s. Ausgabeumleitung). Viele Administratoren vermissen aber eine Funktion, mit der eine Textdatei in eine andere Textdatei eingefügt werden kann. Das nachfolgende Beispiel zeigt eine Batchdatei, mit der genau diese Funktion erreicht wird: Eine Datei wird vor einer anzugebenden Zeile in eine zweite Datei eingefügt. Damit die Batchdatei möglichst universal einsetzbar bleibt, wurde auf einige, ab Windows 2000 mögliche, Optimierungen verzichtet. Damit ist der problemlose Einsatz ab Windows NT4.0 bei eingeschalteten Befehlserweiterungen möglich.

Das Script liest die Zieldatei zeilenweise mit einer for-Schleife ein. Dabei läuft in einer Umgebungsvariablen count ein Zähler mit, der die Anzahl der bereits übertragenen Zeilen zählt. Diese Zeilen werden in der temporären Datei $tmp$.txt gesammelt.

Ist die Einfügezeile erreicht, wird die einzufügende Datei per more an die temporäre Datei angehängt. Danach werden in einer zweiten for-Schleife alle Zeilen aus der Zieldatei an die temporäre Datei angehängt, deren Zeilennummer größer als die der Einfügezeile ist.

Das Ergebnis ist eine einzelne Datei mit dem Ergebnis der Einfügeoperation. Diese wird dann anschließend noch über die Zieldatei kopiert.

Parameter

  • %1 = Quelldatei

  • %2 = Zieldatei

  • %3 = Zeilennummer, vor der eingefügt werden soll

Code

@echo off
if !%3 == ! goto err
if not exist %1 goto err
if not exist %2 goto err
if not %3 GTR 0 goto err
goto ok

:err
echo Insert a text file into another text file before
line #.
echo.
echo Usage: %0 [source] [target] [line#]
echo.
echo Line number must be greater then 0 and both files
must exist.
echo If line number is greater then line count in
target, source file
echo will be appended.
echo Target file will be modified, need write access for
this file.
echo.
goto eof

:ok
if exist $tmp$.txt del $tmp$.txt
set count=0
for /F "tokens=*" %%f in (%2) do call :tran1 "%%f" %3
more < %1 >> $tmp$.txt
set count=0
for /F "tokens=*" %%f in (%2) do call :tran2 "%%f" %3
copy $tmp$.txt %2 /y
if exist $tmp$.txt del $tmp$.txt
goto eof

:tran1
set /a count=%count%+1
if %count% GEQ %2 goto eof
echo %~1 >> $tmp$.txt
goto eof

:tran2
set /a count=%count%+1
if %count% LSS %2 goto eof
echo %~1 >> $tmp$.txt
goto eof

:eof