satorius
Goto Top

Ordner per Batch in gewünschtes Verzeichnis kopieren

Habe mal wieder nen kleines Problem =D

Ich möchte den Ordner Skript$ der auf \\SV-PC-001\ liegt in das Verzeichnis C:\ kopieren.
Wenn der Ordner Skript$ in C:\ schon existiert soll er nichts kopieren.

Is wahrscheinlich wieder eine ganz leichte Sache =D

Danke schon mal!

Lg Markus

Content-ID: 158857

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

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

Biber
Biber 18.01.2011 um 09:22:01 Uhr
Goto Top
Moin Satorius,

welche Versuche hast du denn schon unternommen, um dich mit der Aufgabenstellung auseinanderzusetzen?

Grüße
Biber
bastla
bastla 18.01.2011 um 09:22:50 Uhr
Goto Top
Hallo Satorius!
Is wahrscheinlich wieder eine ganz leichte Sache =D
... und zwar so leicht, dass Du "if exist" und "xcopy" wohl selbst wirst kombinieren können (da bliebe dann sogar noch Zeit für eine kurze Begrüßung) ...

Grüße
bastla
Satorius
Satorius 18.01.2011 um 09:25:33 Uhr
Goto Top
Hi Biber,

also ich hab mich schon mal durch google durchgewühlt da aber leider nichts gefunden und
mal durchs Forum aber iwie nicht das gefunden was ich brauche =(
Und da Batch für mich noch so ein anfangsthema ist möchte ich halt auch gern dazulernen.

Grüße
Satorius
askando
askando 18.01.2011 um 10:16:50 Uhr
Goto Top
bastla hat genau recht.


if exist ......then go to

xcopy ..... bla
Biber
Biber 18.01.2011 um 10:42:15 Uhr
Goto Top
Zitat von @askando:
bastla hat genau recht.
Vielleicht hat er auch nur ungenau recht - mit der Vermutung bezüglich ausreichender Zeit für eine Begrüßung lag er daneben.

if exist ......then go to

xcopy ..... bla
... ja nee ... bitte poste doch deinen realen Lösungsansatz.
Wir können wirklich gern hier kleine Stützrad-Runden drehen bei deinen ersten Batchzeilen.
Aber im Interesse alle nachfolgenden MitleserInnen sollte am Ende schon eine funktionierende Lösung stehen.

Grüße
Biber
askando
askando 18.01.2011 um 11:26:22 Uhr
Goto Top
ok erstmal hallo um das nachzuholen,

start -> ausführen > cmd -> xcopy /? <<<< das steht eigentlich alles in der Hilfe ....

Inhalt Batch Datei

#blendet das Fenster aus
@echo off

#If NOT exist überprüft ob Ordner test vorhanden, wenn nein dann gehe zu kopieren
if NOT exist "C:\Programme\Test" goto kopieren

#kopiere von \\Servername\freigabename\OrdnerXY
:kopieren
xcopy \\edv\Freigabe\TEST "C:\Programme\TEST" /I /S /E


ergo erstelle einfach eine kopieren.bat und kopiere diesen Inhalt hinein. Pfad natürlich noch abändern

@echo off
if NOT exist "C:\Programme\Test" goto kopieren
:kopieren
xcopy \\edv\Freigabe\TEST "C:\Programme\TEST" /I /S /E

_________________________________________________________________
Snowman25
Snowman25 18.01.2011 um 11:44:52 Uhr
Goto Top
#blendet das Fenster aus
@echo off
FALSCH. @echo off schaltet den sichtbaren Prompt ab. Das @ verhindert dazu auch noch den Prompt in der gleichen Zeile.
#If NOT exist überprüft ob Ordner test vorhanden, wenn nein dann gehe zu kopieren
if NOT exist "C:\Programme\Test" goto kopieren
FALSCH. if NOT exist testet, ob etwas nicht vorhanden ist. Sollte das wahr sein (das nicht-vorhandensein) dann wird zur Sprungmarke :kopieren gesprungen.

#kopiere von \\Servername\freigabename\OrdnerXY
naja... kopiere von <Quelle> nach <Ziel>
:kopieren
ACHTUNG! nachfolgender xcopy-Befehl wird ausgeführt, egal was beim oberen if herauskam. Wenn die if-Abfrage falsch läuft (Ordner ist vorhanden) wird zwar nicht zu :kopieren gesprugen, aber das Skript wird einfach weiter abgearbeitet. Es ist also unerheblich, ob der Ordner C:\Programme\Test existiert oder nicht!
xcopy \\edv\Freigabe\TEST "C:\Programme\TEST" /I /S /E
Switche /S /E sind widersprüchlich. Verkürzbar auf /E.

Probiers lieber so:
@Echo off
set QUELLE="\\SV-PC-001\Skript$"  
set ZIEL="C:\Skript$"  

if exist %ZIEL% goto proccopy
md C:\Skript$
:proccopy
xcopy %QUELLE% %ZIEL% /E /V /C /L /H /R /K /Y /Z
Echo Taste drcken zum fortfahren...
pause>nul
eine Erklärung der Parameter von xcopy findest du per xcopy /?
Jetzt zeigt dir das Skript an, welche Dateien kopiert werden würden. Um sie dann wirklich zu kopieren musst du den /L-Switch aus dem xcopy-Befehl nehmen.

Gruß
Snow
askando
askando 18.01.2011 um 11:50:35 Uhr
Goto Top
shit happends keine Zeit gehabt jemanden ausführlich die Definition zu erkären aber manche leute haben anscheinend eine solche Profilneurose das sie sich auf jedes kleinste Detail stürzen müssen omg ^^

Schalter /S /E ist auch völlig egal ! :D nicht das deine CPU an dem Parameter tot rechnet :D
Snowman25
Snowman25 18.01.2011 um 11:53:05 Uhr
Goto Top
Ich will bloß den Einstieg in die Batchprogrammierung erleichtern. Und das geht nunmal nur mit richtigen Definitionen. Ansonsten versteht man bloß Bahnhof.

Gruß
Snow
askando
askando 18.01.2011 um 11:55:18 Uhr
Goto Top
Batchprogrammierung lernt man aber anders und nicht in einem howto von xcopy und if exist naja egal ich mags halt nur nicht jemanden ne Lösung zu geben (eben schnell) und dann so zerflückt zu werden
Biber
Biber 18.01.2011 um 13:32:20 Uhr
Goto Top
Hmmja, askando,

Zitat von @askando:
Batchprogrammierung lernt man aber anders und nicht in einem howto von xcopy und if exist naja egal ich mags halt nur nicht
jemanden ne Lösung zu geben (eben schnell) und dann so zerflückt zu werden

Sieh es bitte mal so:
In einigen anderen Foren wärest du mit einem platten "RTFM!" abgebügelt worden
oder mit einem kommentarlosen Link auf ein "Batchkurs für Zitronenfalter"-Tutorial.

Hier hast du ebenso wie Satorius die Chance, mit Netz und doppeltem Boden die ersten geführten Gehversuche zu machen.
Und ja, du wirst dabei etwas überkorrekt auf kleine Fehler (auch kleine Unsauberkeiten in der B-Note) hingewiesen.
Und nochmal ja, wenn du in zwei Wochen ein bisschen Routine hast und etwas mehr Sicherheit, dann wirst du beim Lesen dieses Beitrags wahrscheinlich denken "omg, wie peinlich... da war ich ja total ahnungslos".

Dann können wir den Beitrag/den Kommentar gerne dann wegknallen.

Dennoch - beim Einstieg in irgendetwas, was irgendwann eventuell mal auf produktiven Servern zur Berechnung der Dioxinbeimengung in die tägliche Futtermenge verwendet wird - lass uns da am Anfang lieber etwas pingeliger sein als nötig.

Niemand meint es böse.

Zitat von @askando:
Batchprogrammierung lernt man aber anders
Dann gib uns doch mal einen Tipp, wie wir es besser vermitteln können...

Grüße
Biber
Satorius
Satorius 18.01.2011 um 13:34:54 Uhr
Goto Top
Hi askando und Hi Snowman25,

erst mal möchte ich euch beiden für eure Mühe danken.
Und ich finde es auch ok wenn askando schnell eine Lösung postet.

Und bei Snowmann25 finde es auch super das du das aufgegliedert hast =)
Ich denke beides is wichtig um das zu lernen.

Auf alle Fälle werde ich das ausprobieren und dann das Ergebnis Posten.


Aber trotzdem vielen Dank euch beiden =)

Lg Satorius
bastla
bastla 18.01.2011 um 13:41:00 Uhr
Goto Top
@askando
Deine Zustimmung (relativ weit oben face-wink) freut mich, allerdings gab es bei meinem Hinweis (und hoffentlich auch im fertigen Batch) kein "goto" (aber gerne das inzwischen von Dir ja schon vorgeschlagene "not" ...

Grüße
bastla
Satorius
Satorius 18.01.2011 um 18:37:08 Uhr
Goto Top
So Leute ich hab mal die komplette Batch-Datei angehängt
Iregendwo müssen noch kleine fehler stecken!
@echo off
echo ########################################################
echo #                                                                                                                              #
echo #        Serververfügbarkeit wird überprüft                                                         #
echo #                                                                                                                              #
echo #        Created by Sysadmin          Version 1.0                                                #
echo #        -------------------------------------------------------------------------                    #
echo #        Bei Problemen bitte an folgende                                                           #
echo #        E-Mail-Adresse wenden: sys                                                                  #
echo #        oder telefonisch unter 000000000000000                                          #
echo #                                                                                                                              #
echo ########################################################
echo.
echo.
echo Aktuell angemeldeter Benutzer wird ermittelt:
echo. 
echo.
echo Hallo %USERNAME% 	Sie werden jeden Augenblick am Server angemeldet.
echo.
echo.
echo.
timeout /T 5  > nul
echo.
echo ##----------------------------------------------------##
echo # Es wird ermittelt ob der Server schon erreichbar ist #
echo ##----------------------------------------------------##
echo Dies kann etwas Zeit in Anspruch nehmen.
echo.
echo.
echo !!!WICHTIGER HINWEIS!!! 	Bitte dieses Fenster nur minimieren nicht schließen!
echo.
echo.
timeout /T 5  > nul
echo.

:Anfang 
SET PFAD= \\SV-PC-001\nex-srv-00$
if exist %PFAD% goto :LoginScript in relevantes Verzeichnis kopieren
if not exist %PFAD% goto :Anfang

:LoginScript in relevantes Verzeichnis kopieren
echo ##-----------------------------------------------------##
echo # LoginDatei wird gesucht...                            #
echo ##-----------------------------------------------------##
echo.
set QUELLE= \\SV-PC-001\Skript$
set ZIEL= C:\Skript$ 

if exist %ZIEL% goto :UserLogin
if not exist %ZIEL% goto :proccopy 
md C:\Skript$ 

:UserLogin
echo ##-----------------------------------------------------##
echo # LoginDatei wird ausgeführt                            #
echo ##-----------------------------------------------------##
echo.
start C:\Skript$\Anmeldescript.bat
goto :weiter



:proccopy
echo ##-----------------------------------------------------##
echo # LoginDatei wird in das relevante Verzeichnis kopiert  #
echo ##-----------------------------------------------------##
echo.
xcopy %QUELLE% %ZIEL% /E /V /C /H /R /K /Y /Z 
echo. 
goto :UserLogin

:weiter
exit


Lg
Satorius

[Edit Biber] Einen kleinen Fehler hab ich berichtigt: die Codeformatierung [/Edit]
[Edit2 Biber] Allerdings gehen bei Codefomatierung die "#(viele viele Leerzeichen)#"-Zeilen ganz kaputt, sorry [/Edit2]
Satorius
Satorius 18.01.2011 um 19:29:34 Uhr
Goto Top
Danke =)

nur leider macht er genauso viel wie vorher =(

er sagt auch bei dem Kopieren der Datei "Ungültige Laufwerksangabe"

=(
Biber
Biber 18.01.2011 um 19:41:41 Uhr
Goto Top
Moin Satorius,

okay, dann noch mal einen "echten" Fehlerhinweis:

Die CMD.exe/Batchsyntax erlaubt keine optisch-ästhetischen Formatierungen, insbesondere gehören leading and trailing blanks beim Zuweisen/Setzen von Variablen dann entweder zum Variablennamen oder zum Variablenwert.

Beispiel: Mit
set QUELLE= \\SV-PC-001\Skript$
setzt du eine Variable %QUELLE%, der Weret ist "LEERZEICHEN plus \\SV-PC-001\Skript$ plus LEERZEICHEN.

Schreibe es so, dass du erkennen kannst, ob und wo versehentlich überzählige Leerzeichen enthalten sind.:
set "QUELLE=\\SV-PC-001\Skript$"

--> Dieser Fehler könnte deinen Folgefehler-Effekt verursachen.

Grüße
Biber
bastla
bastla 18.01.2011 um 20:46:38 Uhr
Goto Top
Hallo Satorius!

Ergänzend zu Bibers Hinweisen (und unter der Annahme, dass Du sie auch umgesetzt hast) noch einige Anmerkungen zur Ablauflogik:
Wenn Du aus
if exist "%PFAD%" goto :LoginScript in relevantes Verzeichnis kopieren  
if not exist "%PFAD%" goto :Anfang  
die erste Zeile weglässt, ändert sich am Verhalten schon mal gar nix - auch nicht, dass die Variable %PFAD% bei jedem Schleifendurchlauf neuerlich (auf den selben Wert) gesetzt wird - daher dieses "set" besser schon vor dem Label ":Anfang" erledigen ...
Da Du früher oder später, aber in jedem Fall, zu ":UserLogin" willst, bietet sich auch hier eine Änderung an:
if exist "%ZIEL%" goto :UserLogin  

echo ##-----------------------------------------------------##
echo # LoginDatei wird in das relevante Verzeichnis kopiert  #
echo ##-----------------------------------------------------##
echo.
xcopy "%QUELLE%" "%ZIEL%\" /CEHK  
echo. 

:UserLogin
echo ##-----------------------------------------------------##
echo # LoginDatei wird ausgeführt                            #
echo ##-----------------------------------------------------##
echo.
start C:\Skript$\Anmeldescript.bat
bzw alternativ auch:
if not exist "%ZIEL%" (  
    echo ##-----------------------------------------------------##
    echo # LoginDatei wird in das relevante Verzeichnis kopiert  #
    echo ##-----------------------------------------------------##
    echo.
    xcopy "%QUELLE%" "%ZIEL%\" /CEHK   
    echo. 
)

:UserLogin
...
Die Schalter für "xcopy" musst Du Dir zwar grundsätzlich selbst überlegen, allerdings sind zumindest "/R" und "/Y" schon mal überflüssig, wenn es am Zielort nix zu überschreiben gibt face-wink ...

Das "md" vorweg ist ebenfalls entbehrlich, da "xcopy" nicht existierende Zielordner automatisch erstellt - und wenn die Angabe des Zieles mit einem "\" endet, ist auch klar, dass mit dem Ziel ein Ordner gemeint ist.
Schließlich noch das "exit" - bzw besser nicht: Wenn es nicht zusätzlich durch einen Schalter "/b" einen Sinn erhält: Lass es einfach weg (und wenn auch nur, damit Du beim Testen nicht jedes Mal aus der CMD-Shell fliegst face-wink) ...
Letzte Überlegung(en): Da Du ja vor allem die Batchdatei "C:\Skript$\Anmeldescript.bat" benötigst, würde ich (mit dem "if not exist") deren Vorhandensein prüfen (und sie dann - wenn kein besonderer Grund dagegen spricht - ganz ohne "start" am Ende des Batches aufrufen).

Grüße
bastla
60730
60730 18.01.2011, aktualisiert am 18.10.2012 um 18:45:33 Uhr
Goto Top
Servus,

ich würde das ganze ja Andreas.Kreuz mäßig lösen....
  • Ganz ohne if exist, und vor allem kürzer....
  • Der User soll doch nix davon mitkriegen, dass sein Loginscript (warum auch immer) lokal abgespeichert wird.
  • Wenn man die Bätch kurz hält kann man die nicht nur besser überblicken, auch die kopiererei geht schnell - so schnell, das die ganze echo Arie sinnlos ist face-wink
  • Ein Vermerk V1.0 ist zwar schön, interessiert den User aber doch auch nicht - wenn man es unbedingt will - dann haben die Dateiinfos genügend Platz für sowas.
  • ob der User, der ein Problem mit seinem Loginskript hat, die Zeit findet - sich die Email Adresse zu merken, waage ich in Zweifel zu stellen - wie er überhaupt eine Mail abschicken kann, wenn sein Login in die Hose geht, könnte man auch an der Stelle überlegen..

cd /d C:\Skript$>nul 2>nul && C:\Skript$\Anmeldescript.cmd ||xcopy "\\SV-PC-001\Skript$\*.*" "C:\Skript$\" /CEHK & C:\Skript$\Anmeldescript.cmd >nul  
Im Klartext:
Springe zum Ordner C:\Skript$ und wenn (und nur dann) es den gibt, führe C:\Skript$\Anmeldescript.cmd² aus.
Gibt es den Ordner nicht - wird der xcopy Befehl gestartet und danach das skript. Fast ganz silent, ohne meinen Freund

  • ² In heutigen Zeiten, sollte man der Abwärtskompatibilität und alten Zoten (vor allem wenn man frisch am lernen ist) Adieu sagen und Bätche, die erweiterte Befehle brauchen auch beim Namen nennen .cmd nicht .bat.

Gruß
bastla
bastla 19.01.2011 um 00:31:45 Uhr
Goto Top
@t-mo
Durchaus - bei mir wäre oben auch ein Oneliner rausgekommen, und Deine Variante wäre sinnvoll noch auf
xcopy /CDEHKY "\\SV-PC-001\Skript$\*.*" "C:\Skript$\" && C:\Skript$\Anmeldescript.cmd
(+ die gewünschten "@", ">nul" und "2>nul") zu reduzieren ...

... aber da hier schon mit den Arien begonnen war ... face-wink

Grüße
bastla

[Edit] Hier, im Gegenzug zu oben, dann natürlich mit zumindest "/Y" für "xcopy" [/Edit]
60730
60730 19.01.2011 um 15:52:28 Uhr
Goto Top
Salü,

[OT]
@ Bastla:
... aber da hier schon mit den Arien begonnen war ...
Eben deshalb hab ich mich ja getraut frischen Wind reinzupusten, ist eh ein Kunstück, dass der Fred noch die Wende geschafft hat.

Und miruns ist doch eh klar, wer im B Bereich die besten Bätsche baut face-wink

[/OT]
bastla
bastla 19.01.2011 um 16:34:25 Uhr
Goto Top
[OT 2]
@t-mo
Und miruns ist doch eh klar, wer im B Bereich die besten Bätsche baut face-wink
Mir ja auch - obwohl: Biber hat hier ja gar nicht gebaut (sondern nur die Bauaufsicht erledigt) ... face-wink

Grüße
bastla
[/OT 2]
Satorius
Satorius 21.01.2011 um 09:50:47 Uhr
Goto Top
Hi Leute

wollte mich nur mal kurz melden und sagen das alles bis auf ein kleines Problem super funktioniert.
Und zwar sobald die Netzlaufwerke z. B. public$ verbunden werden kommt es bei manchen Netzlaufwerken dazu das
als Name dann nur da steht

Netzlaufwerk (Pface-smile

Wie kommt das`?


Lg Satorius
bastla
bastla 21.01.2011 um 10:53:20 Uhr
Goto Top
Hallo Satorius!

Abgesehen davon, dass mir die Fragestellung nicht wirklich klar ist, passt das Thema ohnehin nicht mehr unter den aktuellen Threadtitel - daher bitte einen neuen Beitrag erstellen (und dort zB auch einen Screenshot integrieren) ...

Grüße
bastla