jonny83
Goto Top

CMD die Server aus einer TXT liest und dann eine Datei kopiert

Hallo zusammen.

hier im Forum konnte ich einen sehr guten Beitrag von "bastla" finden.
Leider klappt es bei mir nicht so richtig was ich daraus gebastelt habe.

Folgendes:

ein einfacher Copy Befehl:
copy /y C:\skripte\Anpassungen_Verteilen\test.txt \\Server1\skripte$\test.txt

da sich die Server ständig ändern und auch die zu kopierende Datei ständig ändern wollte ich eine zentralisierte Lösung schaffen.
So will ich jetzt nicht jedesmal die Zeile komplett kopieren und von Hand den Servernamen ändern.

und eben Dank "bastla" habe ich soweit das hier:
**@echo off & setlocal**
**set "Liste=C:\skripte\Anpassungen_Verteilen\alle_Batchserver.txt"**  
**set "Log=C:\skripte\Anpassungen_Verteilen\Log.txt"**  

**del "%Log%" 2^>nul **  
**for /f "usebackq delims=" %%i in ("%Liste%") do >>"%Log%" copy /y C:\skripte\Anpassungen_Verteilen\test.txt \\%%i\skripte$\test.txt**  
Infos:
txt alle_batchserver:
Server1
Server2
Server3
Server4
Server2323
ServerA
ServerB
.....
Die Log Datei sollte so aussehen:
Server1 Datei XYZ erfolgreich kopiert
Server2 Datei XYZ erfolgreich kopiert
....
Jetzt motzt aber immer die CMD Box was von ...kann nul nicht finden.... und das Log schreibt auch nur 1 Datei kopiert usw....

kann mich hier jemand unterstützten und das Skript da oben etwas säubern und anpassen?

vielen Dank im Voraus!!!
Kommentar vom Moderator Dani am 08.07.2010 um 10:54:51 Uhr
Code-Tags hinzugefügt.... einfach besser zu lesen.

Content-ID: 146466

Url: https://administrator.de/forum/cmd-die-server-aus-einer-txt-liest-und-dann-eine-datei-kopiert-146466.html

Ausgedruckt am: 23.12.2024 um 07:12 Uhr

bastla
bastla 08.07.2010 um 09:42:26 Uhr
Goto Top
Hallo jonny83!

Die Zeile 6 würde ich zunächst eher so schreiben
for /f "usebackq delims=" %%i in ("%Liste%") do copy C:\skripte\Anpassungen_Verteilen\test.txt \\%%i\skripte$\test.txt >nul && >>"%Log%" echo %%i Datei test.txt erfolgreich kopiert
(und danach noch "test.txt" durch eine Variable ersetzen) ...

Grüße
bastla
jonny83
jonny83 08.07.2010 um 10:53:25 Uhr
Goto Top
Hallo bastla - super danke das du mir geantwortet hast!!

ich konnte das auch schon erfolgreich testen!

Deine Idee bei der Ausgabe eine Variable zu schreiben hab ich auch umgesetzt.


Hast du mir vielleicht noch eine Hilfestellung wie ich es anstelle oben noch eine variable zu setzen:
also zum Beispiel SET "ZIEL=\\%%1\skripte\usw...."   
so könnte ich dann wirklich nur noch oben unter SET meine Quell und Ziel Datei anpassen und schauen das die Serverliste immer aktuell ist.
@echo off & setlocal
set "Liste=C:\skripte\Anpassungen_Verteilen\alle_Batchserver.txt"  
set "Log=C:\skripte\Anpassungen_Verteilen\Log.txt"  
set "QuellDatei=C:\skripte\Anpassungen_Verteilen\test2.txt"  

del "%Log%" 2^>nul  
for /f "usebackq delims=" %%i in ("%Liste%") do copy %QuellDatei% \\%%i\skripte$\ >nul && >>"%Log%" echo %%i Datei %QuellDatei% erfolgreich kopiert  
BigWim
BigWim 08.07.2010 um 11:17:32 Uhr
Goto Top
Ich will ja nicht vorgreifen, aber hast Du es nicht einfach mal probiert?

@echo off & setlocal
set "Liste=C:\skripte\Anpassungen_Verteilen\alle_Batchserver.txt"  
set "Log=C:\skripte\Anpassungen_Verteilen\Log.txt"  
set "QuellDatei=C:\skripte\Anpassungen_Verteilen\test2.txt"  
Set Ziel="skripte\usw"  

del "%Log%" 2^>nul  
for /f "usebackq delims=" %%i in ("%Liste%") do copy %QuellDatei% \\%%i\%Ziel%\ >nul && >>"%Log%" echo %%i Datei %QuellDatei% erfolgreich kopiert  

Markus
jonny83
jonny83 08.07.2010 um 13:00:33 Uhr
Goto Top
Also - es ist gelöst!

Danke an BASTLA und BIGWIM !!!

Hier mein Skript für das Verteilen von CMDs oder TXT Dateien <-- so wie ich es halt grad brauche:

@echo off & setlocal
echo.
echo.
echo
echo.
echo Quelle und Ziel angepasst ???
echo.
echo Serverliste stimmt auch?
echo.
echo C:\skripte\Anpassungen_Verteilen\alle_Batchserver.txt
echo.
echo
echo.
echo.
pause
set "Liste=C:\skripte\Anpassungen_Verteilen\alle_Batchserver.txt"
vset "Log=C:\skripte\Anpassungen_Verteilen\Log.txt"

set "QuellDatei=C:\skripte\cmd\Hosts_vergleichen\Vergleiche_hosts.cmd"
Set "Ziel=skripte$\cmd\Hosts_vergleichen\"


del "%Log%" 2^>nul
for /f "usebackq delims=" %%i in ("%Liste%") do copy %QuellDatei% \\%%i\%Ziel%\ >nul && >>"%Log%" echo %%i Datei %QuellDatei% erfolgreich kopiert


Hier mein Skript um Dateien zu löschen ...

@echo off & setlocal
echo.
echo.
echo
echo.
echo Quelle und Ziel angepasst ???
echo.
echo Serverliste stimmt auch?
echo.
echo C:\skripte\Anpassungen_Verteilen\alle_Batchserver.txt
echo.
echo
echo.
echo.
pause
set "Liste=C:\skripte\Anpassungen_Verteilen\alle_Batchserver.txt"
set "Log=C:\skripte\Anpassungen_Verteilen\Log.txt"

set "delDatei=*.txt"
Set "Ziel=skripte$"


del "%Log%" 2^>nul
for /f "usebackq delims=" %%i in ("%Liste%") do del \\%%i\%Ziel%\%delDatei% >nul && >>"%Log%" echo %%i Datei %delDatei% erfolgreich gelöscht//**


Meine Umgebung:

C:\skripte\Anpassungen_Verteilen

Inhalt:
Lösche.cmd
Verteile.cmd
alle_Batchserver.txt <-- hier stehen die Server drin:
Server1
Server2
Serverxyz
jonny83
jonny83 08.07.2010 um 16:44:33 Uhr
Goto Top
Hallo,

ich habe doch noch eine Frage bzw. einen Nachtrag.

Die Zeilen des Skriptes habe ich jetzt in einem anderen Skript übernommen.
Dort ist es aber in einer Abfrage drin und funktioniert nicht mehr.
Das ganze Skript klappt super gut! Nur musste ich ganz unten bei dem Kopierbefehl auf immer alle Server in jede Zeile kopieren - sehr Mühsam! Jetzt ist mir eingefallen das ich das Thema mit der alle_server.txt ja hier auch super verwenden kann. Leider klappt das aber nicht. Mein Skript, wie gesagt, klappt 100%ig bzgl. der Errorlevel Erkennung - der Mail die dann verschickt wird usw..... aber der Kopiervorgang klappt nicht!

"......auszug....... ANFANG"

IF ERRORLEVEL 1 (

%MailEXE% -s EXchange -t %RCPT% -f %ABS% -h -a "%Subj%" -m %LOG% -c

echo %Liste%

for /f "usebackq delims=" %%i in ("%Liste%") do copy \\serverxyz\freigabe$\datei1.txt \\%%i\skripte$\ >nul && >>"%Log%" echo %%i Datei %QuellDatei% erfolgreich kopiert

)

"......auszug.......ENDE "


Die Mail wird verschickt - aber die Dateien werden nicht kopiert!!!!

PS: die Mail Adresse und datei usw... habe ich verändert - sind im Original aber Funktionsfähig!


Hier das komplette Skript!!!!!!

@echo off
echo.

set "HOSTalt=C:\skripte\cmd\alt.txt"  
set "LOG=C:\skripte\cmd\neuer.txt"  
set "MailEXE=C:\.....exe"  
set "Subj=hallo e-mail"  
set "RCPT=admin@mail.de"  
set "ABS=skript@mail.de"  
set "Liste=C:\skripte\cmd\alle_Batchserver.txt"  
Set "Ziel=skripte$\cmd\"  


del "%LOG%"  


echo Skript text mit Meldungen zur Bearbeitung folgen !   >> %LOG%
echo --------------------------------------------------------------------------------- >> %LOG%
echo ----------------------zu bearbeitende DATEN----------------------- >> %LOG%
echo --------------------------------------------------------------------------------- >> %LOG%

fc.exe %alt% \\server1\date1 /N >> %LOG%
fc.exe %alt% \\server2\datei1 /N >> %LOG%

find "Keine Unterschiede gefunden" %LOG% ' find gibt Error 1 zurück wenn er einen Treffer landet! In jedem anderen Fall gibt er irgendwas anderes aus....  

echo %errorlevel%

IF ERRORLEVEL 1 ( 

	%MailEXE% -s EXchange -t %RCPT% -f %ABS% -h -a "%Subj%" -m %LOG% -c  

	echo %Liste%

	for /f "usebackq delims=" %%i in ("%Liste%") do copy \\serverxyz\freigabe$\datei1.txt \\%%i\skripte$\ >nul && >>"%Log%" echo %%i Datei %QuellDatei% erfolgreich kopiert  

)

:End



[Edit Biber] Gecodetagged...äh...codegetaggert...formatiert eben. Siehe BigWims Anmerkungen unten [/Edit]
BigWim
BigWim 08.07.2010 um 17:21:21 Uhr
Goto Top
Hier würde darauf tippen, dass hier ein paar & fehlen. Bin mir aber nicht ganz sicher:

echo %errorlevel%

IF ERRORLEVEL 1 ( 

%MailEXE% -s EXchange -t %RCPT% -f %ABS% -h -a "%Subj%" -m %LOG% -c  

&

echo %Liste%

&

for /f "usebackq delims=" %%i in ("%Liste%") do copy \\serverxyz\freigabe$\datei1.txt \\%%i\skripte$\ >nul && >>"%Log%" echo %%i Datei %QuellDatei% erfolgreich kopiert  

)

Ein Tipp am Rande. Vom dem hier habe ich auch noch längst nicht alles verinnerlicht, ist aber eine großartige Einsteigerhilfe!

Markus


[OT]
Ich weiß ja nicht, wie aufmerksam andere sind, aber ich habe die Frage eher zufällig gesehen.

Ich denke, wenn Du das einmal als gelöst markiert hast und in diesem Zusammenhang aber eine neue Frage ergibt, dann solltest Du auch eine neue Frage einstellen. Meinetwegen mit Verweis auf den "alten" Thread

[/OT]

[noch ein OT]
Mir fällt es leichter, dem Thread und die Fragen zu folgen, wenn Du die Formatierungshilfen nutzen würdest und z. B. dein Script in < code > < /code> Tags einschließen würdest.

Danke!
[/noch ein OT]
bastla
bastla 08.07.2010 um 17:41:53 Uhr
Goto Top
Hallo jonny83!

Vorweg: Die nicht definierte Variable %QuellDatei% wird ja nur für die Logeinträge verwendet und sollte daher als Fehlerquelle ausscheiden ...
Ändere bitte die erste Zeile auf
echo on & setlocal
(das "setlocal" soll dann übrigens auch bleiben, wenn Du später wieder ein "echo off" daraus machst) und schau Dir einmal an, welche Befehle denn nun wie ausgeführt werden - Zeit dazu hast Du, wenn Du den Batch direkt aus einer CMD-Shell startest oder durch ein "pause" anstelle des unnötigen ":End" ...
Noch eine Anmerkung: Da Du ja das Log per Mail verschickst, solltest Du die Reihenfolge ändern: zuerst kopieren, dann mailen ...
@BigWim
Die Verknüpfung der einzelnen Befehle durch "&" ist nicht nötig - dafür sorgen ja die Klammern ...

Grüße
bastla
BigWim
BigWim 08.07.2010 um 18:12:40 Uhr
Goto Top
Zitat von @bastla:
@BigWim
Die Verknüpfung der einzelnen Befehle durch "&" ist nicht nötig - dafür sorgen ja die Klammern ...
AHA! Dann gilt das aber nur, weil das eine IF-Anweisung ist, oder?

Danke für die Richtigstellung

Markus
bastla
bastla 08.07.2010 um 18:20:07 Uhr
Goto Top
@BigWim
Dann gilt das aber nur, weil das eine IF-Anweisung ist, oder?
Grundsätzlich für alle "geklammerten" Blöcke aus mehreren Zeilen (typischer Weise auch bei "for"-Schleifen gerne verwendet) ...

Grüße
bastla
jonny83
jonny83 09.07.2010 um 07:56:11 Uhr
Goto Top
Guten Morgen,

danke für die Hinweise bzgl. Code und neuer Thread mit Verlinkung ...

eines noch - das Skript kopiert immer noch nicht ... face-sad

IF ERRORLEVEL 1 ( 


	for /f "usebackq delims=" %%i in ("%Liste%") do copy \\server1\datei1 \\%%i\skripte$\ >nul && >>"%Log%" echo %%i Datei %QuellDatei% erfolgreich kopiert  

	%MailEXE% -s exchange -t %RCPT% -f %ABS% -h -a "%Subj%" -m %LOG% -c  

	echo %Liste%

)
jonny83
jonny83 09.07.2010 um 08:11:24 Uhr
Goto Top
Ach ihr seid meine HELDEN !!!!!!!!!!!!!!

Danke für das Echo on !!!!!!

ich hatte nicht die Berechtigung bei dem Copy die Quelle zu lesen face-sad <-- dummerweise sah ich das im LOG nicht weil ich ja selber schreibe "erfolgreich kopiert" ;-P

erst jetzt durch das echo on konnte ich das begreifen ....

ich danke euch 10000fach für eure Hilfe!!!!!!!!!!