stevie72
Goto Top

Problem mit einer Batchdatei

Guten Abend zusammen!
Ich habe ein problem eine Batch ans laufen zu bekommen.

Folgende Problem Stellung:
Wir haben etwa 20 Rechner in der Bibliothek. Darauf läuft ein Programm zum suchen.
Auf einem Rechner läuft ein Programm (ich nenne es mal Programm_C.exe )
dieses Programm läuft z.b. von Laufwerk C (Programm_C.exe) und ein anderes mal auf einem anderen Rechner von D (Programm_D.exe) hängt vom Rechner ab.
Es soll soll beendet werden und via netzwerk up-gedated werden.

Dann beim Restart des Computers soll das neue Programm über die vorhandene autoexec batch gestartet werden..

Wichtig hierbei ist es soll berücksichtigt werden ob es auf c: oder d: installiert ist ... da es unterschiedliche versionen sind.

mein ansatz hierfür: sorry .. ich bin a.) rentner und b.) anfänger


net use "x: \\xxx.xxx.xxx.xxx\ user:admin admin"   
net use /persistent:no					  :: persistent:no -> speichert die Verbindung nicht.
echo Netzwerk Laufwerk x:\ gemounted				      :: Laufwerk x gemounted ohne Anmeldedaten Speicherung

set sourceFile_C="x: \\xxx.xxx.xxx.xxx\Folder1\Update\Programm_C.exe"     :: Source vom Netzwerk für drive c  
set sourceFile_D="x: \\xxx.xxx.xxx.xxx\Folder1\Update\Programm_D.exe"     :: Source vom Netzwerk für drive d   

set Programm_C="Programm_C.exe"					         :: Laufwerk C   
set Programm_D="Programm_D.exe"					         :: Laufwerk D   

set targetDir_C="C:\Folder\Update\"						::   
set targetDir_D="D:\Folder\Update\"						::    


::******************************************************************************************************************************************************************

IF EXIST %targetDir_C% (								                :: Installiert auf Drive C?
del %targetDir_C\%Programm_C%							        :: Lösche altes Programm File
tasklist |find /i "%Programm_C%" >nul )                					:: läuft der Task Programm_C?  
if %errorlevel% == 0 (taskkill /F /IM  "%Programm_C%"   				:: Rückgabe Wert = 0 Task Aktiv / 1 Inaktiv	  
copy "%sourceFile_C" "%targetDir_C%">nul)  

IF EXIST %targetDir_D% (								                :: Installiert auf Drive D?
del %targetDir_D\%Programm_D%							                :: Lösche altes Programm File
tasklist |find /i "%Programm_D%" >nul )                					:: läuft der Task Programm_D?  
if %errorlevel% == 0 (taskkill /F /IM  "%Programm_D%"   				:: Rückgabe Wert = 0 Task Aktiv / 1 Inaktiv	  
copy "%sourceFile_D%" "%targetDir_D%">nul)  


net use x: /DELETE     								                        :: unmount Service Drive
exit

hat jemand eine idee wie beide Konstrukte zusammen gefasst werden können?

Content-ID: 749680834

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

Ausgedruckt am: 25.11.2024 um 13:11 Uhr

Xerebus
Xerebus 19.06.2021 um 18:52:08 Uhr
Goto Top
Hab jetzt nicht ganz verstanden was du willst, aber ich glaube die lösung ist psexec.
stevie72
stevie72 19.06.2021 aktualisiert um 19:22:05 Uhr
Goto Top
Guten Abend!

ich versuche es mal zu erklären.
Wir haben in der Bücherrei unterschiedliche Computer. Alle am Netzwerk.
Also ich möchte den code zusammengefasst haben und über eine entscheidung die mir %c% oder %d% (Lauferwerk C oder D)
liefert dann jeweils eine folge routine ausführt. Damit möchte ich den doppelten Code einsparen. Der Code ist nur ein Auszug .. nicht die finale Version..

weil darin sind viele Programmteile Doppelt vorhanden ..

Wie im Code zu sehen ist

Was mir fehlt ist ein beispiel für eine Sinnvolle zusammenfassung dann kann ich den restlichen Code ergänzen
em-pie
em-pie 19.06.2021 aktualisiert um 19:54:35 Uhr
Goto Top
Moin,

Dann ermittle in einem vorgelagerten Block, ob dein Programm in C:\ oder in D:\ liegt. Danach schreibst du den Ofad in eine Variable u d arbeitest mit der Veriablen weiter:

Logisch gesprochen (Syntax nicht ganz korrekt):
SET target_c=C:\Folder\myProgram.exe
target_d=D:\Folder\myProgram.exe

IF exists (target_c)
  SET target=%target_c%
  goto task

IF exists (target_d)
  SET target=%target_d%
  goto task

Exit

:task
Echo %target%
stevie72
stevie72 19.06.2021 um 19:50:15 Uhr
Goto Top
Genau danach suchte ich
Herzlichen Dank!
stevie72
stevie72 20.06.2021 aktualisiert um 11:04:10 Uhr
Goto Top
Guten Morgen zusammen!

Ich habe den Code soweit lauffähig.

jetzt habe ich nur ein kleines Problem mit einem logfile.

Wenn noch kein logfile vorhanden ist -> erstellen von logFile. Funktioniert soweit.
Wenn ein logfile existiert soll es umbenannt werden in logfile_alt dann neues logfile erstellen.

Ziel ist es immer 2 logfiles zu haben. Ein neues aktuelles und eine version davor.

hier ist der part um den es geht..

if exist %logFile%_alt del %logFile%_alt || ren %logFile% %logFile%_alt goto weiter	:: LogFile existiert -> umbenennen 	
if not exist %logFile_alt% ren %logFile% %logFile_alt%					:: Log File 

Weiter:


robocopy "%sourceDir%" "%targetDir%" /MIR /ETA /V /R:2 /W:2 /BYTES /UNILOG:"%logFile%" /TEE  

kann man das so schreiben ? bei mir wir immer zusätzlich eine "0 datei erzeugt" .. deren Sinn erkenne ich nicht
em-pie
em-pie 20.06.2021 um 11:50:49 Uhr
Goto Top
Moin,

was du suchst, nennt sich Logrotation.

Als separates Script kannst du dir das auf github "stibizen":
https://gist.github.com/urin/3b68e8388cc34a688d13


Fernab wird dein Problem womöglich aber folgendes sein:
du nutzt in Zeile 2 %logFile%_alt
und in Zeile 3 %logFile_alt%

Zudem: was meinst du mit folgender Aussage?
bei mir wir immer zusätzlich eine "0 datei erzeugt"
stevie72
stevie72 20.06.2021 um 12:24:26 Uhr
Goto Top
Moin

es wird eine Datei mit namen 0 erzeugt die ist 23 Byte gross ..
bildschirmfoto 2021-06-20 um 12.23.57
em-pie
em-pie 20.06.2021 um 12:29:26 Uhr
Goto Top
Dann ist die Variable %logFile% leer.

Ohne de Code zu kennen, ist das schwierig.

Mach doch mal ein
echo %logFile% 
PAUSE
stevie72
stevie72 20.06.2021 aktualisiert um 13:13:04 Uhr
Goto Top
Hallo em-pie
hier ist mein Code ..zum besseren verständnis

chcp 1252											:: Umlaute äüöÜÄÖß
set ue=ü
set ae=ä
set oe=ö
set Uue=Ü
set Aae=Ä
set Ooe=Ö
set ss=ß

::*******************************************************************************************************************************************************************************

net use „X: \\xxx.xxx.xxx.xx\ user:xx xxxx“ 
net use /persistent:no										:: persistent:no -> speichert die Verbindung nicht.
echo Netzwerk Laufwerk X:\  - mounted								:: Laufwerk  gemounted ohne Anmeldedaten Speicherung
echo

ipconfig | findstr IPv4    									:: IP Adresse des Rechners

set sourceDir=„X: \\xxx.xxx.xxx.xxx\Service\"    						:: Source Dir  

::*******************************************************************************************************************************************************************************

IF exists C:\Service\Software									:: Existiert Laufwerk C mit Ordner physikalisch als Laufwerk?
   set target=%C%										:: Zuweisung target als C
   goto rename											:: weiter mit rename

IF exists D:\Service\Software									:: Existiert Laufwerk D mit Ordner physikalisch als Laufwerk?
   SET target=%D%										:: Zuweisung target als D
   goto rename											:: weiter mit rename

::*******************************************************************************************************************************************************************************

rename:
set targetDir=%target%":\Service\Software\"							:: target Dir  

if not exist %targetDir% logFile.txt goto weiter						:: kein Logfile vorhanden erstmalig eins erstellen.  

if exist %targetDir% logFile_alt.txt del logFile_alt.txt || 
   ren logFile.txt logFile_alt.txt || del %targetDir% logFile.txt goto weiter			:: LogFile existiert -> umbenennen 	

if not exist %targetDir% logFile_alt.txt ren %tagetDir% logFile.txt logFile_alt.txt ||		:: Log File umbenennen in logFile_alt.txt und löschen
 del %targetDir% logFile.txt	

Weiter:


::*******************************************************************************************************************************************************************************

echo.
echo =============== Robocopy =================
echo ===== Aktualisiere die Service Files =====
echo.

robocopy "%sourceDir%" "%targetDir%" /MIR /ETA /V /R:2 /W:2 /BYTES /UNILOG:"%logFile%" /TEE    :: Updated Files vom Netzwerk auf C: / D: kopieren  
				   		
::   /MIR Komplettes Verzeichnis wird gespiegelt, also auch nicht mehr vorhandene Dateien gelöscht.   
::   /ETA Die Dauer des Kopiervorgangs wird angezeigt
::   /V Erzeugt eine ausführliche Ausgabe und zeigt alle übersprungenen Dateien an.
::   /B Kopiert Dateien im Sicherungsmodus.
::   /R:2 Gibt die Anzahl von Wiederholungsversuchen für fehlerhafte Kopiervorgänge an. 
::   /W:2 Gibt die Wartezeit zwischen Wiederholungen in Sekunden an. Der Standardwert von n ist 30 (Wartezeit 30 Sekunden).
::   /BYTES 
::   /UNICODE Zeigt die Status Ausgabe als Unicode-Text an.
::   /UNILOG:<Logfile> Schreibt die Status Ausgabe als Unicode-Text in die Protokolldatei (überschreibt die vorhandene Protokolldatei).
::   /TEE Schreibt die Status Ausgabe in das Konsolen Fenster sowie in die Protokolldatei.


if %errorlevel% == 0 (							  			:: 0 = kein Fehler von robocopy
echo.
echo.
echo ======== Laufwerk %target%  update erfolgreich durchgeführt ==========
echo.

) else (									  		:: sonst Fehlermeldung ausgeben

echo.
echo.
echo =================  Laufwerk %target%  Update Fehler  ==================
echo.
)

::*******************************************************************************************************************************************************************************


@echo off
net use X: /DELETE     										:: unmount Netzlaufwerk

:end
pause>nul											:: wartet auf Taste

exit


::*******************************************************************************************************************************************************************************
em-pie
em-pie 20.06.2021 um 13:12:53 Uhr
Goto Top
Moin,

an einigen Stellen fallen mir Fehler auf.

Du verwendest die goto-Marken falsch
Es kommt erst der Doppeltpunkt und dann der Bezeichner. Achte auf auch Groß- und Kleinschreibung

Zeile 12: Laufwerk X wird verbunden und du verbindest dich nur zu einem Server - da fehlt die ANgabe der Freigabe"
Zeile 14: "Laufwerk S ist verbunden"

Mache es so:
SET drv=x:
SET server=\\192.168.47.11
SET share=\Service
SET usr=SomeUser
SET pwd=!S3cr37!

NET USE %drv% %server%%share% /user:%usr% %pwd% /persistent:yes

IF %errorlevel% equ 1(
  echo An error occured: [%errorlevel%]
  exit
) else (
  echo Drive %drv% mapped
)

Weiter im Text:
Zeile 17 ist so unnütz wie Hämorriden face-wink
Zeile 19 ergibt auch keinen Sinn


Zeile 36 ff hast du überall Leerzeichen zwischen Pfad und Name der Logdatei enthalten

Zeile 38 und 41 läuft deine Prüfung ins leere, da es den Pfad zur LogFIle so nicht gibt (denk an das Leerzeichen).
Zeile 38+39 löscht du das alte Log (OK), benennst die logFile.txt in LogFile_alt.txt um (OK) UND versucht das nicht mehr vorhandene logFile.txt zu löschen (nicht OK, da idurch ren nicht mehr vorhanden)

Zeile 41+42: sind quatsch, denn da steht "Wenn die Datei nicht existiert, benenne sie um" und obendrein hast du statt eines Backslahes ein Slash genutzt - das Mag Windows nicht so...

Zeile 54: Du hast ein keiner STelle die Variable %logFile% definiert. Deswegen legt robocopy eine Datei names 0 an. Nutze zudem /UNILOG+ dann hängt er die Ergebnisse an.

Zeile 68 - 73: du willst dich beim error-Handling auf XCOPY beziehen, setzt aber ROBOCOPY ein -> https://ss64.com/nt/robocopy-exit.html

Zeile: 86: Nutze
net use %drv% /del


Genereller Tip:
ICH lege mir zu Beginn eines Scriptes (egal ob Powershell/ Batch/ VBS/ ...) immer einen Block an, in dem ich alle relevanten Variablen edfiniere und mit Leben fülle. Dann muss ich bei änderungen nur in den Kopf gehen und nicht an 28 Stellen im Quellcode suchen.
stevie72
stevie72 20.06.2021 um 13:29:32 Uhr
Goto Top
Vielen Dank erstmal für deine Mühe !
Ich werde mir deine Änderrungsvorschläge mal Stück für Stück ansehen.
Dir noch einen schönen Tag.
Stefan
stevie72
stevie72 22.06.2021 aktualisiert um 09:02:14 Uhr
Goto Top
Guten Morgen zusammen,

eine frage habe ich dennoch:

warum funktioniert Beispiel A.) und B.) nicht ..?

Beispiel A.)

NET USE x: \\111.112.112.12\Service /user:xx 1234 /persistent:no


Beispiel B.)

set drv=x:												:: Laufwerk
set server=\\111.112.112.12										:: IP des Servers
set share=\Service											:: Shared Drive
set usr=xx												:: User
set pwd=1234												:: Password 

NET USE %drv% %server%%share% /user:%usr% %pwd% /persistent:no						:: persistent:no 
em-pie
em-pie 22.06.2021 um 09:08:46 Uhr
Goto Top
Moin,

woran machst du aus, dass A) funktioniert und B) nicht?
Was gibt dir B) als Fehlermeldung zurück?

was sagt ein
echo NET USE %drv% %server%%share% /user:%usr% %pwd% /persistent:no 


Am Rande: deine IPs musst du nicht "maskieren".
Ich nehme an (und hoffe inständig), dass die IP deines Servers entweder mit 192.168., oder mit 10. oder mit 172.16. bis 172.16.31. beginnt.
Wenn dem so ist, bewegst du dich innerhalb des RFC1918, wie es mehrere Millionen Haushalte und Firmen INTERN nutzen. Man kann somit keine Rückschlüsse auf dich/ deine Daten ziehen.
stevie72
stevie72 22.06.2021 aktualisiert um 10:50:03 Uhr
Goto Top
Guten Morgen em-pie

Zunächst die IP . ich habe bewusst nicht die richtige IP angegeben ...
und ja sie beginnt mit 192

Ich habe ein kleines Skript daraus gemacht und eine pause>nul zur anzeige eingefügt.

Beispiel A.) funktioniert B.) nicht..

Ich denke das etwas mit dem Syntax falsch ist ..

Beispiel A.) gibst noch einen Systemfehler 85 zurück aber das Laufwerk wird korrekt gemounted B.) nicht

Der lokale Gerätename wird bereits verwendet.
em-pie
em-pie 22.06.2021 um 10:58:58 Uhr
Goto Top
Zitat von @stevie72:

Guten Morgen em-pie

Zunächst die IP . ich habe bewusst nicht die richtige IP angegeben ...
und ja sie beginnt mit 192
Dann ist es egal. AVM bestückt ja bei der AUslieferung die FritzBoxen auch mit 192.168.178.1/24. Ob die Fritte nun beim Oma Erna, dem Enkel Jonas oder dem Vater Ingo steht, ist jetzt auch nicht ersichtlich.

Der lokale Gerätename wird bereits verwendet.
Eindeutiger geht es nicht. Dein Laufwerk X existiert schon.
Führe nach A) mal ein net use (interaktiv) aus. Dann wirst du sehen, dass es dein X: schon gibt.