Per Batchdatei kopieren, wenn eine bestimmte Anzahl und Bezeichnung von Dateien in einem Verzeichnis vorhanden sind
Hallo,
um einen Kopiervorgang per robocopy zu starten, möchte ich zunächst in einem bestimmten Verzeichnis prüfen, ob bestimmte Dateien im Quellverzeichnis vorhanden sind.
Wenn ja, soll der Kopiervorgang starten. Wenn nein, soll eine Fehlermeldung erscheinen.
Quelle:
S:\install\AidA\kopieren\Datei_1
S:\install\AidA\kopieren\Datei_2
S:\install\AidA\kopieren\Datei_3
S:\install\AidA\kopieren\Datei_4
Ziel:
\\Mueller-R\C$\Program Files\AidA
Im Quellverzeichnis dürfen nur genau diese 4 Dateien enthalten sein... keine weiteren!!
Nur dann soll kopiert werden.
Mein bisheriger Code:
In diesem Code habe ich schon mal mit "if exist", bzw. "if not exist" versucht... aber ich denke, dass es elegantere Lösungen gibt
Danke und Gruss,
imebro
um einen Kopiervorgang per robocopy zu starten, möchte ich zunächst in einem bestimmten Verzeichnis prüfen, ob bestimmte Dateien im Quellverzeichnis vorhanden sind.
Wenn ja, soll der Kopiervorgang starten. Wenn nein, soll eine Fehlermeldung erscheinen.
Quelle:
S:\install\AidA\kopieren\Datei_1
S:\install\AidA\kopieren\Datei_2
S:\install\AidA\kopieren\Datei_3
S:\install\AidA\kopieren\Datei_4
Ziel:
\\Mueller-R\C$\Program Files\AidA
Im Quellverzeichnis dürfen nur genau diese 4 Dateien enthalten sein... keine weiteren!!
Nur dann soll kopiert werden.
Mein bisheriger Code:
@ echo off
set "quelle=S:\install\AidA\kopieren"
set "ziel=\\Mueller-R\C$\Program Files\AidA"
if exist S:\install\AidA\kopieren\Datei_1 goto copy
if not exist S:\install\AidA\kopieren\Datei_1 goto fehler
:copy
robocopy "%quelle%" "%ziel%" /S /Z
:fehler
echo Bitte Verzeichnis "S:\install\AidA\kopieren" prüfen!
%SystemRoot%\explorer.exe "%ziel%"
exit
In diesem Code habe ich schon mal mit "if exist", bzw. "if not exist" versucht... aber ich denke, dass es elegantere Lösungen gibt
Danke und Gruss,
imebro
5 Antworten
- LÖSUNG TlBERlUS schreibt am 13.04.2016 um 09:07:18 Uhr
- LÖSUNG imebro schreibt am 13.04.2016 um 10:09:27 Uhr
- LÖSUNG rubberman schreibt am 13.04.2016 um 18:26:43 Uhr
- LÖSUNG imebro schreibt am 14.04.2016 um 08:49:54 Uhr
- LÖSUNG rubberman schreibt am 14.04.2016 um 19:05:39 Uhr
- LÖSUNG imebro schreibt am 14.04.2016 um 08:49:54 Uhr
- LÖSUNG rubberman schreibt am 13.04.2016 um 18:26:43 Uhr
- LÖSUNG imebro schreibt am 13.04.2016 um 10:09:27 Uhr
LÖSUNG 13.04.2016, aktualisiert um 09:13 Uhr
Guten Morgen,
Powershell:
Powershell:
clear-host
$source = "C:\Users\test\Desktop\source"
$dest = "C:\Users\test\Desktop\dest"
$files = gci $source | ?{$_ -match "Datei_[1-4]{1}"}
$files2 = gci $source
if ($files2.count -eq $files.count){
foreach($f in $files){
if ($f -match "Datei_[1-4]{1}.txt"){
Copy-Item $source\$f -Destination $dest
}
}
}else{
Write-Host "Bitte Verzeichnis $source prüfen!" -ForegroundColor red
}
LÖSUNG 13.04.2016, aktualisiert um 16:55 Uhr
Vielen Dank...
Die Dateibezeichnungen "Datei_1" bis 4 waren nur stellvertretend gewählt.
Es handelt sich um 4 ganz unterschiedliche Dateien mit unterschiedlichen Endungen.
Zusätzlich gibt es in meinem Code 5 unterschiedliche Ziele (für 5 Mitarbeiter).
Im Moment habe ich daher beim SET-Befehl Ziel1 bis Ziel5 definiert und ebenso beim robocopy-Befehl Ziel1 bis Ziel5 angesprochen.
Wie würde ich das realisieren und im Code eingeben?
LG
imebro
Hier mein momentaner kompletter Code:
Bin aber nicht sicher, ob ich damit tatsächlich ermitteln kann, ob wirklich nur 1 Verzeichnis und 3 Dateien im Quell-Ordner liegen, obwohl ich bei der if-Abfrage ja eine UND-Verknüpfung nutze.
Die Dateibezeichnungen "Datei_1" bis 4 waren nur stellvertretend gewählt.
Es handelt sich um 4 ganz unterschiedliche Dateien mit unterschiedlichen Endungen.
Zusätzlich gibt es in meinem Code 5 unterschiedliche Ziele (für 5 Mitarbeiter).
Im Moment habe ich daher beim SET-Befehl Ziel1 bis Ziel5 definiert und ebenso beim robocopy-Befehl Ziel1 bis Ziel5 angesprochen.
Wie würde ich das realisieren und im Code eingeben?
LG
imebro
Hier mein momentaner kompletter Code:
@ echo off
set "quelle=S:\install\AidA\kopieren"
set "ziel1=C:\Program Files\AidA"
set "ziel2=\\Mueller-R\C$\Program Files\AidA"
set "ziel3=\\Maier-B\C$\Program Files\AidA"
set "ziel4=\\Schmitz-C\C$\Program Files\AidA"
set "ziel5=\\Mühl-A\C$\Program Files\AidA"
if exist %quelle%\lib if exist %quelle%\aida-frontend-1.0.0-SNAPSHOT.jar if exist %quelle%\start-aida-32bit.bat if exist %quelle%\start-aida-64bit.bat (goto copy)else (goto fehler)
:copy
robocopy "%quelle%" "%ziel1%" /S /Z /LOG+:aida.log
robocopy "%quelle%" "%ziel2%" /S /Z
robocopy "%quelle%" "%ziel3%" /S /Z
robocopy "%quelle%" "%ziel4%" /S /Z
robocopy "%quelle%" "%ziel5%" /S /Z
goto ende
:fehler
echo Bitte Verzeichnis "S:\install\AidA\kopieren" prüfen!
pause
goto ende2
:ende
%SystemRoot%\explorer.exe "%ziel1%"
EOF
:ende2
%SystemRoot%\explorer.exe "%quelle%"
EOF
Bin aber nicht sicher, ob ich damit tatsächlich ermitteln kann, ob wirklich nur 1 Verzeichnis und 3 Dateien im Quell-Ordner liegen, obwohl ich bei der if-Abfrage ja eine UND-Verknüpfung nutze.
LÖSUNG 13.04.2016 um 18:26 Uhr
Hallo imebro,
wie viele überflüssige GOTOs willst du denn noch in die paar Zeilen Code packen?
Zu deiner Frage: Wenn es nicht weniger als die 4 Items sein dürfen, reicht deine Abfrage. Wenn es aber auch mehr als diese 4 sein könnten und du das auch als Fehler werten willst, brauchst du eine weitere Prüfung.
Verarbeite die Ausgabe des DIR Befehls und zähle die gefundenen Items (geht mit FIND, siehe unten). Wenn es 4 sind, geht's mit dem nächsten IF weiter ...
Grüße
rubberman
wie viele überflüssige GOTOs willst du denn noch in die paar Zeilen Code packen?
Zu deiner Frage: Wenn es nicht weniger als die 4 Items sein dürfen, reicht deine Abfrage. Wenn es aber auch mehr als diese 4 sein könnten und du das auch als Fehler werten willst, brauchst du eine weitere Prüfung.
Verarbeite die Ausgabe des DIR Befehls und zähle die gefundenen Items (geht mit FIND, siehe unten). Wenn es 4 sind, geht's mit dem nächsten IF weiter ...
@echo off &setlocal
REM Deine Variablendefinitionen hier ...
for /f %%i in ('dir /b "%quelle%\"^|find /c /v ""') do if "%%i"=="4" if exist "%quelle%\lib\" if exist "%quelle%\aida-frontend-1.0.0-SNAPSHOT.jar" if exist "%quelle%\start-aida-32bit.bat" if exist "%quelle%\start-aida-64bit.bat" (
robocopy "%quelle%" "%ziel1%" /S /Z /LOG+:aida.log
robocopy "%quelle%" "%ziel2%" /S /Z
robocopy "%quelle%" "%ziel3%" /S /Z
robocopy "%quelle%" "%ziel4%" /S /Z
robocopy "%quelle%" "%ziel5%" /S /Z
%SystemRoot%\explorer.exe /n,/e,"%ziel1%"
exit /b
)
echo Bitte Verzeichnis "%quelle%" pruefen!
pause
%SystemRoot%\explorer.exe /n,/e,"%quelle%"
Grüße
rubberman
LÖSUNG 14.04.2016, aktualisiert um 09:18 Uhr
Hallo rubberman,
danke für Deine Mühe...
Tja, wenn ich die richtige Lösung bereits gewußt hätte, hätte ich natürlich auf die ganzen überflüssigen GOTOs verzichtet
Mit "find" und der "for-Abfrage" wird also nun ermittelt, ob sich tatsächlich nur 1 Verzeichnis und 3 Dateien in dem Quellverzeichnis befinden? Bei der ersten Angabe ".../lib" handelt es sich nämlich um ein Verzeichnis mit dem Namen "lib".
Und ja... es dürfen nicht mehr und nicht weniger Verzeichnisse/Dateien in dem Quellverzeichnis sein.
In einem eben durchgeführten Test mit einem Test-Zielverzeichnis, wurden tatsächlich das eine Verzeichnis (lib) sowie die 3 Dateien (.jar und .bat) dort hinein kopiert.
Danke und Gruss,
imebro
danke für Deine Mühe...
Tja, wenn ich die richtige Lösung bereits gewußt hätte, hätte ich natürlich auf die ganzen überflüssigen GOTOs verzichtet
Mit "find" und der "for-Abfrage" wird also nun ermittelt, ob sich tatsächlich nur 1 Verzeichnis und 3 Dateien in dem Quellverzeichnis befinden? Bei der ersten Angabe ".../lib" handelt es sich nämlich um ein Verzeichnis mit dem Namen "lib".
Und ja... es dürfen nicht mehr und nicht weniger Verzeichnisse/Dateien in dem Quellverzeichnis sein.
In einem eben durchgeführten Test mit einem Test-Zielverzeichnis, wurden tatsächlich das eine Verzeichnis (lib) sowie die 3 Dateien (.jar und .bat) dort hinein kopiert.
Danke und Gruss,
imebro
LÖSUNG 14.04.2016 um 19:05 Uhr
Hallo imebro
Grüße
rubberman
Mit "find" und der "for-Abfrage" wird also nun ermittelt, ob sich tatsächlich nur 1 Verzeichnis und 3 Dateien in dem Quellverzeichnis befinden?
Es wird ermittelt, ob sich genau 4 Dateisystemelemente dort befinden. Hier wird noch nichts über die Eigenschaften dieser Elemente geprüft.Bei der ersten Angabe ".../lib" handelt es sich nämlich um ein Verzeichnis mit dem Namen "lib".
Ja, das hatte ich bereits vermutet und entsprechend berücksichtigt, indem ich für die Prüfung einen Backslash angehängt habe. Gäbe es statt dem Verzeichnis "lib" eine Datei "lib", würde dieser Test fehlschlagen.Grüße
rubberman