Aus einem Pfad sollen alle Dateien, inkl. die,die in Unterordnern gespeichert sind, aber nicht die Unterordner an sich, sondern nur die Dateien, kopiert werden?

1 Antwort

Das Problem bei derartigen Aktionen ist, dass existierende Dateien, welch aus zuvor kopierten Ordnern stammen, durch gleichnamige Dateien aus anderen Ordnern überschrieben werden!

Ist das Vorhandensein gleichnamiger Dateien ausgeschlossen, ist die Sache trivial:

demo. cmd

@echo off
chcp 65001 >nul
rem hier deine Pfade  (Voll oder Relativ) einsetzen...
set "SourceFolder=Test"  
set "DestinationFolder=Ziel"

md "%DestinationFolder%" 2>nul &rem Zielordner  erzeugen , wenn er noch nicht existiert

 rem der einfache , aber "gefährliche"  Weg , gleichnamige Dateien würden überschrieben
 rem alle Dateien im Quellordner (und dessen Unterordnern) ermitteln
for /f "tokens=*" %%a in ('where /r "%SourceFolder%" "*.*"') do (
    copy "%%~a" "%DestinationFolder%\" >nul &&(
        echo "%%~a" nach "%DestinationFolder%\%%~nxa" kopiert
    )
)
pause

Ein überschrieben würd Dir sicher nicht gefallen... , dann muss eine Überprüfung und eventuelles automatisches erzeugen eines alternativen Namens, her.

Narrensicher.cmd

@echo off
chcp 65001 >nul

set "SourceFolder=Y:\Server-MODS"  
set "DestinationFolder=%UserProfile%\Documents\blubb\mods"

md "%DestinationFolder%" 2>nul 
for /f "tokens=*" %%a in ('where /r "%SourceFolder%" "*.*"') do (
    rem weil man innerhalb eines Klammeblocks nicht springen darf den kopiercode in eine Subroutine verlegen.
    call :copyfile "%%~a" "%DestinationFolder%"
)
echo fertig...
pause
exit /b
:::Subroutines:::
:copyfile
  set "count=1"
  set "DestinationFile=%~2\%~nx1"
  :extendName
    if not exist "%DestinationFile%" goto :copyIt
     rem neuen Namen zusammenbasteln (einfach nummerieren)...
    set /a "count+=1"
    set "DestinationFile=%~2\%~n1__%count%%~x1"
  goto :extendName
  :copyIt
    copy "%~1" "%DestinationFile%" >nul &&(
      echo "%~1" nach "%DestinationFile%" kopiert
    )
exit /b

das gleiche in Powershell:

Narrensicher.ps1

$SourcePath='test'
$DestinationPath='Ziel'
md $DestinationPath -force >$Null


Get-ChildItem -Path $SourcePath -Filter '*.*' -File -Recurse|
  ForEach-Object {
    $DestinationFile="$DestinationPath\$($_.Name)"
    $Count=1
    while (Test-Path $DestinationFile){
      $Count++
      $DestinationFile="$DestinationPath\$($_.BaseName)__$Count$($_.Extension)"
    }
    Copy-Item $_.FullName $DestinationFile -verbose
  }
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren