37414
Goto Top

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:

@ 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 face-wink

Danke und Gruss,
imebro

Content-Key: 301658

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: TlBERlUS
TlBERlUS Apr 13, 2016 updated at 07:13:57 (UTC)
Goto Top
Guten Morgen,

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  
}
Mitglied: 37414
37414 Apr 13, 2016 updated at 14:55:32 (UTC)
Goto Top
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:

@ 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.
Member: rubberman
rubberman Apr 13, 2016 at 16:26:43 (UTC)
Goto Top
Hallo imebro,

wie viele überflüssige GOTOs willst du denn noch in die paar Zeilen Code packen? face-wink

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
Mitglied: 37414
37414 Apr 14, 2016 updated at 07:18:51 (UTC)
Goto Top
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 face-wink

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
Member: rubberman
Solution rubberman Apr 14, 2016 at 17:05:39 (UTC)
Goto Top
Hallo imebro

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