mchael
Goto Top

Batchdatei per Batch konfigurieren

Ich möchte mit einer Konfigurationsbatch Variablen in einer anderen Batchdatei verändern.

Hallo Mitglieder von Administrator.de,
ich hab mich die letzten 2-3 Wochen mit Batchprogrammierung beschäftig und auch viele Beispiele und Hilfestellungen in diesem Forum gefunden/genutzt. Jedoch komm ich nun leider nicht mehr weiter mit meinem Verhackstückeln, da mir leider tiefergehendes Wissen fehlt.

Ich habe eine Batchdatei geschrieben, welche Verzeichnisse bereinigt (unnötige Dateien verschiebt/löscht), in ein Archiv packt (winrar) und anschließen auf CD brennt (xcopy + incd). Damit ich nicht für jede neue Umgebung, in welcher ich diese Batch nutzen will, die komplette Batch umschreiben muss, habe ich alle Pfade über Variablen definiert. Das Programm klappt ganz gut, jedoch kam mir nun die Idee, daß ich doch bestimmt die Konfiguration für jede einzelne Umgebung auch noch automatisieren kann. Die Batch soll mir bestimmte Programmpfade automatisch suchen und dann an die dafür definierten Variablen in der Datensicherungsbatch übergeben. Jedoch stoß ich hier auf die Grenzen meiner Programmteilvorlagenzusammenkopierundeditierkunst.

Die Pfade (Beispiel Winrar) kann ich ja mit folgendem Befehl suchen:
dir c:\winrar.exe /s /b
Hier stoße ich schon auf die erste Schwierigkeit. Was ist, wenn es mehrere Festplatten gibt, kann ich direkt in allen Laufwerken suchen?
Das zweite Problem ist, wie ich diese Information in die andere Batch reinbekomme. Mit ">" kann ich die Information ja auch in eine andere Datei schreiben.

Mit "findstr" kann ich wohl auch nach der Variable in der anderen Batch selbst suchen, aber ich bekam es leider nicht hin die Beispiele so zu verändern, daß sie machten, was ich will...
Die andere Option die mir noch einfällt, wäre, daß ich irgendwie die ganzen Informationen mit der ersten Batch in ein ini.txt schreibe und dann die Variablen aus der zweiten Batch irgendwie auf diese ini zugreifen lasse.


Wie ihr sicherlich seht, besteht mein Wissen zu Zeit nur aus "Reverse Engineering" ich hoffe ich finde irgendwo "Stapelverarbeitung for Dummys" und kann mich mal richtig in die Materie einarbeiten.


PS.: Hier ist mal der Kopf meiner Datensicherungsbatch:
REM =======================VARIABLEN=======================
:: Datensicherungspfade:
set DaSi=D:\DaSi\
set Backupordner=%DaSi%Backup\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%\
set Status=%Backupordner%Status.txt
:: Systempfade:
set Winrar=c:\Programme\Winrar\winrar
set CDROM=e:\
:: Handelpfade:
set WaWi=c:\Datenbankpfad
set Inventur=%WaWi%V3\Database\Inventory\
:: Sicherungsname
set Backup=Backup_Name.rar
REM ======================PROGRAMMTEIL=====================

Content-Key: 118724

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Jun 22, 2009 at 10:26:08 (UTC)
Goto Top
Herzlich willkommen im Forum M!chael !

Für die suche hätte ich da meine StartApps.cmd die sucht standartmäßig meine PortableApps und startet diese bzw die eingegebene Anwendungen. Damit des nicht immer ewig dauert, habe ich eine Breitensuche eingebaut.

Vllt kannst Du die dafür brauchen.
SartApps.cmd
@echo off & setlocal
@call :clz 5
echo                     Bitte Programm zum starten eingeben 
@call :lz 3
echo                     um PortableApps zu starten
@call :lz 3
echo                     nur Enter druecken 
@call :lz 6
echo                     warte auf Eingabe
set /p Anwendung=
if "%Anwendung%" == "" (  
	set Anwendung=StartPortableApps.exe
	set Datei=PortableAppsPlatform.exe
	goto :test
)
if not %Anwendung:~-4% == .exe set "Anwendung=%Anwendung%.exe"  
for /f "delims=" %%i in ("%Anwendung%") do set "Datei=%%~ni.exe   "  
:test
@call :clz 5
echo                     %Datei% wird analysiert
for /f %%i in ('tasklist ^| find /i "%Datei%"') do (  
	if "%%i" == "%Datei%" (  
		@call :lz 4
		echo                     %Datei% laeuft bereits
		goto :wt
	)
)
@call :lz
echo                     Startversuch
%Datei% 2>nul
if %errorlevel% == 0 goto :Fertig
@call :clz 5
echo                     %Datei%  wird gesucht!
set /a SV=0
:suche
set /a Ay=0
set /a Ax=0
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
	if exist %%i:\ (
		if not "%bck%" == "1" (  
			cd %%i:\
			%%i:
			call :File %%i:\
		)
	)
)
if "%bck%" == "1" goto :Fertig  
set /a SV+=1
if %Ax% == 0 goto :fmld
goto :suche
:Folder
for /f "delims=" %%i in ('dir /a:d-h-s /b 2^>nul') do if not "%bck%" == "1" call :UFolder "%%i"  
goto :eof & set bck=%bck%
:UFolder
if "%bck%" == "1" goto :eof & set bck=%bck% & set "Ax=%Ax%"  
set /a Ay+=1
cd "%~1"  
if not %errorlevel% == 0 (
set /a Ay-=1
echo Ordner "%~1" wird uebersprungen.  
goto :eof & set bck=%bck% & set "Ax=%Ax%"  
)
call :File
cd..
set /a Ay-=1
goto :eof & set bck=%bck%
:File
if %SV% == %Ay% goto :srchFile
call :Folder
goto :eof & set bck=%bck% & set "Ax=%Ax%"  
:srchFile
set /a Ax+=1
for /f "delims=" %%i in ('dir  /a:-d-h-s /b "%Anwendung%" 2^>nul') do (  
	if not "%bck%" == "1" (  
		if "%Anwendung%" == "%%~nxi" %%i  
		call :clz 5
		echo                     "%%~nxi"  
		call :lz 3
		echo                     wird gestartet
		set bck=1
	)
)
goto :eof & set bck=%bck% & set "Ax=%Ax%"  
:Fertig
call :clz 5
echo                     %Datei% wurde gestartet
call :lz
echo                     Fertig
:wt
if "%1" == "" (set png=6) else set png=%1  
ping localhost -n %png% > nul
goto :eof
:clz
cls
call :lz %1
goto :eof
:lz
@if "%1" == "" (set lz=2) else set lz=%1  
:lzn
@set /a lz-=1
echo.
@if %lz% == 0 (goto :eof) else goto :lzn
:fmld
call :clz 5
if "%Anwendung%" == "StartPortableApps.exe" (echo                     USB Stick nicht gesteckt!) else echo                     %Anwendung%  nicht gefunden!  
goto :eof

quatsch ich wollte noch nicht senden bin noch am schreiben wenn das zu lesen ist.
Member: pieh-ejdsch
pieh-ejdsch Jun 22, 2009 at 12:08:16 (UTC)
Goto Top
So jetzt nochmal richtig.

wieso willst Du erst eine andere Batch erstellen wenn Du doch die Variablen in Deiner Batch dafür hast?
Bau das doch alles in eine Batch ein, die aktive Batch kann doch genauso die Erstellte Ini auslesen bzw Du brauchst diese Ini erst gar nicht.

Für andere Umgebungen... wie sind diese definiert?
wenn Du Deinen Datensicherungsordner immer auf D:\ hast woher weist Du das D:\ existiert. solltest Du (/empfehle ich Dir) also auch eine AUTO abänderung mit ein(zu)bauen.

Ähm... durch den Kopf deiner Batch kann man nicht alle Infos entnehmen!

welche Variablen brauchst Du im weiteren Verlauf der Batch ?

zB
set DaSi=D:\DaSi\
set Backupordner=%DaSi%Backup\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%\
set Status=%Backupordner%Status.txt

kannst Du zu
set Status=D:\DaSi\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%\%Status.txt
verkürzen wenn Du die Variablen
DaSi
Backupordner
nicht mehr weiter benötigst.


um also Winrar immer den Pfad als Autosearch zu übergeben:
@echo off & enabledelayedexpansion
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
	if not defined Winrar if exist %%i:\ (
		for /f "delims=" %%i in ('dir  /a:-d-h-s /b /s Winrar.exe 2^>nul') do set Winrar=%%i  
	)
)

für deinen Datensicherungsordner wäre das dann entsprechend:
@echo off & enabledelayedexpansion
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
	if not defined Inventur if exist %%i:\ (
		for /f "delims=" %%i in ('dir  /a:d-h-s /b /s Inventory 2^>nul ^| find "V3\Database\Inventory\" ') do set Inventur=%%i  
	)
)



Dein Brennerlaufwerk könntest Du wenn/weil Variabeler Buchstabe mit

:Brenner
set /p CDROM=Bitte Laufwerksbuchstabe vom Brenner eingeben!    
if not defined CDROM goto :Brenner
set CDROM=%CDROM:~0,1%:\
definieren.

wenn Du die Batch nur vom CMD ausfüren willst mit
Batchname.bat Brennerbuchstabe
kannst Du
set CDROM=%~1
if not defined CDROM (echo Brennerlaufwerkseingabe fehlt! & ping localhaost -n 4 >nul & exit /b 1)
set CDROM=%CDROM:~0,1%:\
verwenden.
so mehr infos hab ich nicht von Dir bekommen....

Gruß Phil
Member: Mchael
Mchael Jun 22, 2009 at 14:06:51 (UTC)
Goto Top
hmm ok ich hoffe ich bekomm jetzt kein "to long didnt read" ;)
Wir haben eine kleine Warenwirtschaft, welche auf mehreren Computern (>30) installiert ist. Diese Computer gehören keinem gemeinsamen Netz an, sondern sind alle unabhängig voneinander. Als kleinen Freundschaftsdienst haben wir den Kunden eine sehr simple aber funktionierende Datensicherung auf CD-RW Rohlinge in Form einer Batch mitgegeben, welche jeden Abend per Taskplaner automatisch gestartet wird und keinerlei Eingaben durch den Kunden benötigt:
taskkill /T /im wawi.exe
c:\programme\winrar\winrar a -m5 -o+ c:\dasi\backup_kunde123.rar c:\wawi\v3
xcopy C:\DaSi\backup_kunde123.rar d: /y
shutdown -f -r 


Da die Sicherungen größer wurden, beschloßen wir die Batch dahingehen zu ändern, daß sie nun auch unbenötigte Dateien löscht. Ich hab dann folgendes draus gebastelt:

DaSi.bat:
@echo off
REM =======================VARIABLEN=======================
::  Datensicherungspfade:
	set DaSi=D:\DaSi\
	set Backupordner=%DaSi%Backup\%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%\
	set Status=%Backupordner%Status.txt
::  Systempfade:
	set Winrar=c:\Programme\Winrar\winrar
	set CDROM=e:\
::  Handelpfade:
	set WaWi=c:\Datenbankpfad
        set Inventur=%WaWi%V3\Database\Inventory\
::  Sicherungsname
	set Backup=backup_kunde123.rar
REM ======================PROGRAMMTEIL=====================
Title Datensicherung
color 9f

call %DaSi%DASI_Schritt0_prep.bat
ping -n 5 localhost  > nul
echo.

call %DaSi%DASI_Schritt1_clean.bat
ping -n 5 localhost  > nul
echo.

call %DaSi%DASI_Schritt2_pack.bat
ping -n 5 localhost  > nul
echo.

call %DaSi%DASI_Schritt3_burn.bat
ping -n 5 localhost  > nul
echo.
echo.

echo ----------------------------------------
echo Datensicherung erfolgreich abgeschlossen  
echo ----------------------------------------
echo Datensicherung abgeschlossen um: %time:~0,2%:%time:~3,2% >> %Status%
ping -n 10 localhost  > nul

echo on
pause
@shutdown -f -r -t 60 -c "Der PC wird neugestartet um die Datensicherung abzuschließen."  


DASI_Schritt0_prep.bat:
md %Backupordner%
echo Datensicherung wurde gestartet um: %time:~0,2%:%time:~3,2% > %Status%

cls
echo !!WARNUNG!!
echo Bitte den Computer waehrend der Sicherung nicht benutzen!
echo Tasten "STRG" + "C" gleichzeitig druecken um Datensicherung abzubrechen.  
ping -n 5 localhost  > nul
echo.
echo.

echo Arbeitsschritt 1: Sicherungsvorbereitung  
echo ----------------------------------------

echo    - Pruefen ob WaWi gestartet ist.
ping -n 3 localhost  > nul
tasklist |find "Wawi.exe" >nul  
if errorlevel 1 set vorhanden=1
if defined vorhanden (
		echo Task "Wawi.exe" war nicht aktiv: %time:~0,2%:%time:~3,2% >> %Status%  
	echo    ^= Anwendung nicht aktiv.
) else (
	echo    - Anwendung wird  in 60 Sekunden beendet
	ping -n 60 localhost  > nul
	taskkill /f /im Wawi.exe 2>nul
	echo Task "Wawi.exe" wurde beendet um: %time:~0,2%:%time:~3,2% >> %Status%  
	echo    ^= Anwendung "Wawi" wurde beendet)  
set vorhanden=

DaSi_Schritt1_clean.bat:
echo Arbeitsschritt 2: Datenbereinigung  
echo ----------------------------------------
echo    - Suche nach aelterer Datensicherung.
ping -n 3 localhost  > nul

if exist %DaSi%%Backup% (
	echo    -- Alte Datensicherung wird geloescht.
	del %DaSi%%Backup% /f /q
	echo Vorherige Datensicherung wurde geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Aeltere Sicherung nicht vorhanden.
	echo Keine aeltere Datensicherung vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

echo    - Suche nach gepackten Dateien.
ping -n 3 localhost  > nul

set vorhanden=
for /R %Wawi% %%a in (*.zip) do set vorhanden=1
if defined vorhanden (
	echo    -- Zip Archive werden geloescht.
	xcopy %Wawi%*.zip %Backupordner% /s /c /q /r /h /y
	del %Wawi%*.zip /f /q
	echo Zip Archive geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Keine Zip Archive vorhanden.
	echo Keine Zip Archive vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

set vorhanden=
for /R %Wawi% %%a in (*.rar) do set vorhanden=1
if defined vorhanden (
	echo    -- Rar Archive werden geloescht.
	xcopy %Wawi%*.rar %Backupordner% /s /c /q /r /h /y
	del %Wawi%*.rar /f /q
	echo Rar Archive geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Keine Rar Archive vorhanden.
	echo Keine Rar Archive vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

echo    - Suche nach Sicherungskopien.
ping -n 3 localhost  > nul

set vorhanden=
for /R %Wawi% %%a in (_*) do set vorhanden=1
if defined vorhanden (
	echo    -- _Dateien werden geloescht.
	xcopy %Wawi%_* %Backupordner% /s /c /q /r /h /y
	del %Wawi%_* /f /q
	echo _Dateien wurden geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Keine _Dateien vorhanden.
	echo Keine _Dateien vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

set vorhanden=
for /R %Wawi% %%a in (*kopie*) do set vorhanden=1
if defined vorhanden (
	echo    -- Kopien werden geloescht.
	xcopy %Wawi%*kopie* %Backupordner% /s /c /q /r /h /y
	del %Wawi%*kopie* /f /q
	echo Kopien wurden geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Keine Kopien vorhanden.
	echo Keine Kopien vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

echo    - Suche nach Datenbankdateien.
ping -n 3 localhost  > nul

set vorhanden=
for /R %Wawi% %%a in (*.bak) do set vorhanden=1
if defined vorhanden (
	echo    -- Backups werden geloescht.
	xcopy %Wawi%*.bak %Backupordner% /s /c /q /r /h /y
	del %Wawi%*.bak /f /q
	echo Backups wurden geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Keine Backups vorhanden.
	echo Keine Backups vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

set vorhanden=
for /R %Wawi% %%a in (*.log) do set vorhanden=1
if defined vorhanden (
	echo    -- Logs werden geloescht.
	xcopy %Wawi%*.log %Backupordner% /s /c /q /r /h /y
	del %Wawi%*.log /f /q
	echo Logs wurden geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Keine Logs vorhanden.
	echo Keine Logs vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

echo    - Inventursicherungen werden gesucht.
ping -n 3 localhost  > nul

set vorhanden=
for /R %Inventur% %%a in (item.*) do set vorhanden=1
if defined vorhanden (
	echo    -- Inventursicherungen werden geloescht.
	xcopy %Inventur%item.dbf %Backupordner% /s /c /q /r /h /y
	del %Inventur%item.dbf /f /q
	echo Inventursicherungen wurden geloescht: %time:~0,2%:%time:~3,2% >> %Status%
) else (
	echo    -- Keine Inventursicherung vorhanden.
	echo Keine Inventursicherung vorhanden: %time:~0,2%:%time:~3,2% >> %Status%)
ping -n 3 localhost  > nul

set vorhanden=
echo    ^= Datenbereinigung wurde abgeschlossen.
echo Bereinigung abgeschlossen um: %time:~0,2%:%time:~3,2% >> %Status%

DaSi_Schritt2_pack.bat
echo Arbeitsschritt 3: Erstellung Sicherung  
echo ----------------------------------------
ping -n 3 localhost  > nul

echo    - Sicherungsarchiv wird erstellt.
%Winrar% a -m5 -o+ %DaSi%%Backup% %Wawi%
echo Sicherungsarchiv wurde erstellt: %time:~0,2%:%time:~3,2% >> %Status%

ping -n 3 localhost  > nul
echo    ^= Sicherungsarchiv wurde erstellt.

DaSi_Schritt3_burn.bat
echo Arbeitsschritt 4: Backup-CD erstellen  
echo ----------------------------------------
ping -n 3 localhost  > nul

echo    - Daten werden auf CD gebrannt.
xcopy %DaSi%%Backup% %CDROM% /y
echo Backup-CD wurde erstellt: %time:~0,2%:%time:~3,2% >> %Status%
ping -n 3 localhost  > nul

echo    ^= Backup-CD wurde erstellt.



Jetzt sieht halt nicht jeder PC gleich aus. Die Laufwerke sind anders, die Programme liegen woanders und so weiter... Ich hab das ganze schon so vereinfacht, daß ich die Pfade als Variablen in der Kopf Batch definiere. Mir kam halt nachts kurz vom einschlafen die Idee, daß ich die Programmpfade und den Namen für die Sicherung irgendwie automatisch definieren kann und nicht bei jedem Kunden manuell ändern muss. Also eine Batch hätte, welche ich einmalig bei "installation" der Batch ausführe um die eigentlich Batch zu konfigurieren.
Wie gesagt, habe ich im Prinzip diese Batches nicht selber geschrieben, sondern zum größten Teil aus anderen Programmen herauskopiert, im kleinem getestet und für meine Zwecke angepasst. Meine Programmierkenntnisse in Batch sind nicht wirklich die besten ;(
Member: pieh-ejdsch
pieh-ejdsch Jun 24, 2009 at 23:25:12 (UTC)
Goto Top
so nun komm ich mal hierher...

bedeutet jetzt? das die Sicherung funktioniert aber noch nicht auf allen Pcs eingerichtet ist oder ?

jedenfalls brauchst Du eine Installierungshilfe für die Pfadangleichung wegen eines sagen wir "Programmupdates"!
es ist dann in diesem Fall bestimmt doch besser jeweils eine INI Datei anzulegen als jedesmal die Batchdateie(n) zu modifizieren.
das hat dann den Vorteil, wenn wieder ein "Programmupdate" fällig ist, es geht schneller und sauberer und braucht keine erneute Installhilfe.

So ganz ohne manuellen Eingriff wirst Du die Installation nicht hinbekommen, es sei denn von der PacketWriting Software wissen wir den Namen
um den Brennerlaufwerksbuchstaben zu konfigurieren. Mit irgendetwas musst Du ja die Backups auf die RWs bekommen!

das würde eventuell über folgende Befehle zum testen gehen:
  • VOL wenn keine CD drin errolevel 1 aber wenn Cardreader Installiert sind oder noch ein CD laufwerk ist eine eingabe erforderlich.
  • MOUNTVOL gibt so eine Anzeige mit allen eingehangenen Laufwerken aus ich weis nicht wie das Aufgelistet wird aber eine Zeile Vor A:\ ist bei mir das Brennerlaufwerk bzw CDLaufwerk kann natürlich von PC zu PC Verschieden sein.
  • CHKDSK gibt errorlevel 3 wenn keine CD drin ist (Problem Cardreader und weitere CD Laufwerke) meldung wenn CD drin ist, das RAW Dateisysteme nicht unterstützt werden.
  • DIR bei suche nach autorun.inf und Vorhandensein auf CD erfolg, oder bei suche nach einzigartiger datei auf CD vllt Backupdatei? (CD muss drin sein sonst Meldung Gärät nicht bereit.)

Du kannst noch den Laufwerksbuchstaben über den Registryeintrag von einer Brennersoftware bekommen (wenn überall nero oder andere Brennsoftware da ist gehts leicht rauszufinden. sonst weis ich echt nicht wie der Buchstabe ohne manuelle Eingabe zu bekommen ist.

die einzigartigen Backupnamen könntest Du:
  • über das Auslesen der Mac-Adresse der (vorhandenen) Netzwerkkarte. Befehl IPCONFIG -> bleibt immer gleich auch nach Neuinstallation vom System
  • dem Installierungdatum vom System und / oder anderer Software aus der Registry bekommen.
  • der ProductID vom System (was aber vllt bei mehreren gleichen PCs nicht unterschiedlich sein muss wenn OEM-Ware aus der Registry
  • den WPA Key oder SigningHash (hat nichts mit WLAN zu tun) auch aus der Registry ->wäre das einfachste
  • Über eine einzigartige gespeicherte Zeichenfolge in einer Datei -> wenn Datei abhanden kommt ist das schlecht
  • über Seriennummern des Arbeitsspeichers (auch des Herstellungsdatumes) -> externe Software erforderlich CPUID

Die (temp)Pfade der Sicherungsordner sind kein Problem diese zu finden genauso wie die Pfade vom Packprogramm.

so warte auf Feedback