Dateien kopieren, rekursiv in einen Ordner
Hallo und noch ein Frohes neues Jahr 
Ich bin mal wieder etwas ratlos...
Ich Versuche von einem Rechner aus, in einer Freigabe nach einem Ordner zu suchen und dessen Inhalt auf einen anderen Rechner zu kopieren.
Zuvor hatte ich alles lokal auf meinen PC erfolgreich getestet, als ich es dann aber mit UNC Pfaden probiert habe kam das Script anscheinend ins stolpern und konnte die Dateien nicht mehr kopieren.
Leider fällt mir keine Lösung für das Problem ein, ich hoffe das mir jemand von euch helfen kann.
Ein Aufruf des Scripts sieht bei mir folgendermaßen aus:
Das Script ist ursprünglich von Biber, ich habe es dann versucht auf meine Bedürfnisse anzupassen.
Quelle: Administrator.de
Gruß Golsin
Ich bin mal wieder etwas ratlos...
Ich Versuche von einem Rechner aus, in einer Freigabe nach einem Ordner zu suchen und dessen Inhalt auf einen anderen Rechner zu kopieren.
Zuvor hatte ich alles lokal auf meinen PC erfolgreich getestet, als ich es dann aber mit UNC Pfaden probiert habe kam das Script anscheinend ins stolpern und konnte die Dateien nicht mehr kopieren.
Leider fällt mir keine Lösung für das Problem ein, ich hoffe das mir jemand von euch helfen kann.
Ein Aufruf des Scripts sieht bei mir folgendermaßen aus:
file.bat "\\pc1\pfad\zum\durchsuchen" "\\pc2\kopiere\hier\hin" datei_filter
Das Script ist ursprünglich von Biber, ich habe es dann versucht auf meine Bedürfnisse anzupassen.
Quelle: Administrator.de
@echo off & setlocal
Set source=
Set target=
Set source=%1
Set source=%source:~1,-1%
Set target=%2
Set target=%target:~1,-1%
echo. -------------------------------------------
:: %3 Ist der Filter fur den Ordner
echo. Erster Parameter: %1
echo. Zweiter Parameter: %2 Edit: %target%
echo. Dritter Parameter: %3 (Filter)
echo. -------------------------------------------
Pushd "%source%" && Rem In das Source-Verzeichnis wechseln
echo VERARBEITUNG: Versuche erste FOR (Push in "%source%")
REM Die aussere For-Schleife...Fur alle Unterverzeichnisse unterhalb %source%...
FOR /F "delims=" %%i IN ('dir /A:D /b /s %3*') DO (
echo Erstes FOR: Directory [%%i]
REM Zweite For-Schleife...Fur alle Dateien im jeweiligen Unterverzeichnis
PushD "%%i"
FOR /F "delims=" %%a in ('dir /b /A:-d ^2^>nul') do (
REM Das "^2^>nul" unterdruckt die Meldung "Datei nicht gefunden",
REM ...Wenn mal ein leeres Unterverzeichnis dabei sein sollte.
REM ---------------------------------------------------------
REM nachste Datei anzeigen mit vollem Pfad und Namen
echo ...... ["%source%%%~nxa"]
IF not exist "%target%\%%~nxa" (
@echo d| xcopy /Y /R /H /V "%source%\%%~nxa" "%target%\%%~nxa"
)
)
PopD
set dirtoremove=%%i
set dirtoremove=%dirtoremove:~3,0%
echo. %dirtoremove%
echo. rmdir /S /Q "%source%\%dirtoremove%"
)
PopD
)
PopD
goto :eof
Gruß Golsin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 260071
Url: https://administrator.de/forum/dateien-kopieren-rekursiv-in-einen-ordner-260071.html
Ausgedruckt am: 21.04.2025 um 19:04 Uhr
9 Kommentare
Neuester Kommentar
da habe ich wohl etwas falsch verstanden. Robocopy kann soweit ich weiß höchstens die Dateien der obersten Ebene kopieren, aber rekursiv ohne die Verzeichnisstruktur abzubilden nicht. Diese Lösung in Powershell sollte funktionieren:
Als Beispiel werden nur dateien mit *.jpg kopiert
Als Beispiel werden nur dateien mit *.jpg kopiert
$quelle = "\\server1\freigabe1\quell_ordner"
$ziel= "\\server2\freigabe2\ziel_ordner"
get-childitem $quelle -recurse | foreach{
if($_.PSIsContainer -ne $true){
copy-item $_.fullname -Destination $ziel -include "*.jpg"
}
}
versuch es mal mit punkt am anfang: ."C:\mv_out_of_folder_v3.ps1" "\\pc\TEST\Ordner" "\\pc\TEST2\Ordner" "666666"
Was du gemacht hast ist quasi nur textausgabe gewesen, der zweite pfad(text) in der Zeile hat ihn schon umgehauen.
Ich hab den Filter jetzt in where-object reingemacht. Damit kann auch der Ordner gefiltert werden.(geht bestimmt irgendwie besser aber ich komm nicht drauf =/)
Mit diesem Skript, falls z.B. nach "Test" gefiltert wird, werden alle Dateien unterhalb "\\pc\TEST\" gefunden, weil im Pfad "Test" vorkommt.
z.B. $_.Basename um nur im Dateinamen selbst zu filtern etc.
Was du gemacht hast ist quasi nur textausgabe gewesen, der zweite pfad(text) in der Zeile hat ihn schon umgehauen.
Ich hab den Filter jetzt in where-object reingemacht. Damit kann auch der Ordner gefiltert werden.(geht bestimmt irgendwie besser aber ich komm nicht drauf =/)
Mit diesem Skript, falls z.B. nach "Test" gefiltert wird, werden alle Dateien unterhalb "\\pc\TEST\" gefunden, weil im Pfad "Test" vorkommt.
$quelle = $args
$ziel = $args[1]
$filter = $args[2]
get-childitem $quelle -recurse | Where-Object {$_.Fullname -match $filter} |
foreach{
if($_.PSIsContainer -ne $true)
{
copy-item $_.fullname -Destination $ziel
$letztedatei=$_.fullname #das ist nur für die anzeige in der letzten zeile
}
}
get-Childitem $letztedatei |select * #hier wird einiges über die datei angezeigt, damit lässt sich ein filter leichter zusammenbauen.
ja s.u. da wird es auch verwendet.
du könntest nach copy-item auch remove-item $_.fullname machen, damit ist der quellordner am ende leer.
die jetzt leeren ordner können hiermit gelöscht werden(script ergoogelt und leicht angepasst):
$EmptyFolders = Get-ChildItem -Path $quelle |
Where-Object {$_.PSIsContainer -eq $true -and (Get-ChildItem -Path $_.FullName -Recurse) -eq $null} #also wenn es ein leerer ordner ist....
$EmptyFolders | Remove-Item
das entspricht schon fast dem was du hast.
du könntest nach copy-item auch remove-item $_.fullname machen, damit ist der quellordner am ende leer.
die jetzt leeren ordner können hiermit gelöscht werden(script ergoogelt und leicht angepasst):
$EmptyFolders = Get-ChildItem -Path $quelle |
Where-Object {$_.PSIsContainer -eq $true -and (Get-ChildItem -Path $_.FullName -Recurse) -eq $null} #also wenn es ein leerer ordner ist....
$EmptyFolders | Remove-Item
das entspricht schon fast dem was du hast.