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
hat jemand eine idee wie beide Konstrukte zusammen gefasst werden können?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 749680834
Url: https://administrator.de/contentid/749680834
Ausgedruckt am: 25.11.2024 um 13:11 Uhr
15 Kommentare
Neuester Kommentar
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):
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%
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?
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"
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:
Weiter im Text:
Zeile 17 ist so unnütz wie Hämorriden
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
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.
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
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.
Moin,
woran machst du aus, dass A) funktioniert und B) nicht?
Was gibt dir B) als Fehlermeldung zurück?
was sagt ein
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.
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.
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.Guten Morgen em-pie
Zunächst die IP . ich habe bewusst nicht die richtige IP angegeben ...
und ja sie beginnt mit 192
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.