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?
Guten Abend liebe OS-Community,
Ich habe eine konkrete Frage zum Thema xcopy...
Aus Pfad "Y:\Server-MODS" sollen alle Dateien inkl. derer, welche in Unterordnern gespeichert sind, aber nicht die Unterordner an sich, sondern wirklich nur die Dateien an sich in folgenden Pfad per xcopy kopiert werden "C:\Users\User\Documents\My Games\FarmingSimulator2022\mods"
Der Grundcode würde so aussehen:
xcopy /s /h /y /d /q "Y:\Server-MODS" "C:\Users\User\Documents\My Games\FarmingSimulator2022\mods"
Das Kopieren funktioniert, nur halt nicht so, wie ich es oben beschreibe, bzw. es gerne hätte.
Ich will einfach, dass alle Dateien, auch die in den Unterordnern, kopiert werden, aber nicht mit dem/den Ordner/n, wo die Datei drin ist, sondern einfach die Datei zusammen mit den anderen Dateien aus den anderen Unterordnern zusammengeschmissen kopiert werden, versteht ihr was ich meine?
Was muss ich ergänzen? Wie sehe der Batch-Code richtig aussehen?
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