Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateien kopieren, rekursiv in einen Ordner

Frage Entwicklung Batch & Shell

Mitglied: golsin

golsin (Level 1) - Jetzt verbinden

16.01.2015, aktualisiert 22.01.2015, 1998 Aufrufe, 9 Kommentare

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:
01.
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
01.
@echo off & setlocal 
02.
Set source= 
03.
Set target= 
04.
 
05.
Set source=%1 
06.
Set source=%source:~1,-1% 
07.
Set target=%2 
08.
Set target=%target:~1,-1% 
09.
echo. ------------------------------------------- 
10.
:: %3 Ist der Filter fur den Ordner 
11.
echo. Erster Parameter:  %1  
12.
echo. Zweiter Parameter: %2 Edit: %target% 
13.
echo. Dritter Parameter: %3 (Filter) 
14.
echo. ------------------------------------------- 
15.
 
16.
Pushd "%source%" && Rem In das Source-Verzeichnis wechseln 
17.
echo VERARBEITUNG: Versuche erste FOR (Push in "%source%") 
18.
 
19.
REM Die aussere For-Schleife...Fur alle Unterverzeichnisse unterhalb %source%... 
20.
FOR /F "delims=" %%i IN ('dir /A:D /b /s %3*') DO ( 
21.
    echo Erstes FOR: Directory [%%i] 
22.
		REM Zweite For-Schleife...Fur alle Dateien im jeweiligen Unterverzeichnis 
23.
		PushD "%%i"	 
24.
		FOR /F "delims=" %%a in ('dir /b /A:-d ^2^>nul') do ( 
25.
		  REM Das "^2^>nul" unterdruckt die Meldung "Datei nicht gefunden", 
26.
		  REM ...Wenn mal ein leeres Unterverzeichnis dabei sein sollte. 
27.
		  REM --------------------------------------------------------- 
28.
		  REM nachste Datei anzeigen mit vollem Pfad und Namen 
29.
		  echo ...... ["%source%%%~nxa"] 
30.
		  IF not exist "%target%\%%~nxa" ( 
31.
		 @echo d| xcopy /Y /R /H /V "%source%\%%~nxa" "%target%\%%~nxa" 
32.
		  )  
33.
34.
		PopD 
35.
		set dirtoremove=%%i 
36.
		set dirtoremove=%dirtoremove:~3,0% 
37.
		echo. %dirtoremove% 
38.
		echo. rmdir /S /Q "%source%\%dirtoremove%" 
39.
40.
    PopD 
41.
42.
PopD 
43.
goto :eof
Gruß Golsin
Mitglied: Marabunta
16.01.2015 um 12:52 Uhr
ein einzeiler mit robocopy hilft nicht?
robocopy "SOURCE" "DESTINATION" Filter nach Bedarf...
Bitte warten ..
Mitglied: golsin
16.01.2015 um 15:42 Uhr
Das wäre eine Idee, ich probiere das mal aus.
Dankeschön!
Bitte warten ..
Mitglied: golsin
19.01.2015 um 10:17 Uhr
Das klappt alles soweit schon super, nur noch eine kleine letzte Frage.
Wie bringe ich robocopy dazu keine Ordner mit zu kopieren?

So wie ich das gelesen habe sollte "/MOV" nur Dateien und "/MOVE" Dateien und Ordner kopieren.
Bei mir werden jedoch auch die Ordner mit kopiert in denen die zu kopierenden Dateien liegen.
Ich brauche die Dateien zwingend in dem Zielordner ohne Unterordner um von dort weiter arbeiten zu können.

Wie du vorgeschlagen hast, hier der Einzeiler:
01.
robocopy /MOV "\\server1\freigabe1\quell_ordner" "\\server2\freigabe2\ziel_ordner" filter_dateien* /S
Bitte warten ..
Mitglied: Marabunta
19.01.2015, aktualisiert 20.01.2015
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
01.
$quelle = "\\server1\freigabe1\quell_ordner" 
02.
$ziel= "\\server2\freigabe2\ziel_ordner" 
03.
 
04.
get-childitem $quelle -recurse | foreach{ 
05.
if($_.PSIsContainer -ne $true){ 
06.
copy-item $_.fullname -Destination $ziel  -include "*.jpg"  
07.
08.
}
Bitte warten ..
Mitglied: golsin
20.01.2015 um 15:07 Uhr
So langsam wird es hakelig
Trotzdem schon mal vielen dank für deine Hilfe!

Das Programm was das Script ansteuern soll beherrscht kann dies nur mit Batch Dateien. ='(
Also einmal über Batch das Powershell Script anstoßen:
1. Batch:
01.
@echo off 
02.
set PowerShellScriptPath=%4 
03.
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%' '%1' '%2' '%3'";
Zuvor habe ich bei der Batch nach einem Ordner gesucht der einem Filter entsprach und daraus alle Dateien kopiert, bei dem Script was du mir netterweise zur Verfügung gestellt hast, wird nur nach Datei Namen gesucht.
Das ist für mich aber hinderlich, da der Inhalt in dem Ordner, der zu kopieren ist, nicht immer namentlich gleich ist.

2. Powershell:
01.
$quelle = $args[0] 
02.
$ziel = $args[1] 
03.
$filter = $args[2] 
04.
 
05.
get-childitem $quelle*$filter* -recurse | foreach{ 
06.
if($_.PSIsContainer -ne $true){ 
07.
copy-item $_.fullname -Destination $ziel -include "*"  
08.
09.
}
Beim testen jedoch bekomme ich schon beim ausführen schon Probleme

01.
PS C:\Windows\system32> "C:\mv_out_of_folder_v3.ps1" "\\pc\TEST\Ordner" "\\pc\TEST2\Ordner" "666666" 
02.
Unerwartetes Token "\\pc\TEST\Ordner" im Ausdruck oder in der Anweisung. 
03.
Bei Zeile:1 Zeichen:50 
04.
+ "C:\mv_out_of_folder_v3.ps1" "\\pc\TEST\Ordner" <<<<  "\\pc\TEST2\Ordner" "666666" 
05.
    + CategoryInfo          : ParserError: (\\pc27\TEST\Ordner:String) [], ParentContainsErrorRecordException 
06.
    + FullyQualifiedErrorId : UnexpectedToken
Das ist so ziemlich das erste was ich in Richtung PS angehe, ich bin also für jeden netten Tipp offen ;)
Bitte warten ..
Mitglied: Marabunta
LÖSUNG 20.01.2015, aktualisiert 22.01.2015
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.

01.
$quelle = $args[0] 
02.
$ziel = $args[1] 
03.
$filter = $args[2] 
04.
 
05.
get-childitem $quelle -recurse | Where-Object {$_.Fullname -match $filter} | 
06.
foreach{ 
07.
if($_.PSIsContainer -ne $true) 
08.
09.
copy-item $_.fullname -Destination $ziel  
10.
$letztedatei=$_.fullname #das ist nur für die anzeige in der letzten zeile 
11.
12.
13.
get-Childitem $letztedatei |select * #hier wird einiges über die datei angezeigt, damit lässt sich ein filter leichter zusammenbauen.
z.B. $_.Basename um nur im Dateinamen selbst zu filtern etc.
Bitte warten ..
Mitglied: golsin
21.01.2015 um 10:53 Uhr
Aaaaaaah,
die Ausgabe von den Datei Infos mich weiter gebracht, Dankeschön!

01.
$quelle = $args[0] 
02.
$ziel = $args[1] 
03.
$filter = $args[2] 
04.
 
05.
get-childitem $quelle -recurse | Where-Object {$_.DirectoryName -match $filter} | 
06.
	foreach{ 
07.
		if($_.PSIsContainer -ne $true) 
08.
09.
		copy-item $_.fullname -Destination $ziel 
10.
11.
12.
get-childitem $quelle -recurse | Where-Object {$_.PSPath -match $filter} | rm -recurse
Stellt sich mir nur noch die Frage ob das löschen des nun nicht mehr benötigtem Quellunterordner eleganter gelöst werden kann ;)

Sehe ich das richtig, dass ich mit einem
-and
zusätzliche Objektdefinitionen angeben kann?
Also:
Where-Object {$_.Fullname -match $filter -and $_.PSPath -match 'blablabla' -and ......}
Bitte warten ..
Mitglied: Marabunta
LÖSUNG 21.01.2015, aktualisiert 22.01.2015
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.
Bitte warten ..
Mitglied: golsin
22.01.2015, aktualisiert 23.01.2015
So hatte ich das anfangs auch, den Ordner leeren und später alle leeren Ordner löschen.
Es kam mir nur etwas doppelt gemoppelt vor, weswegen ich auch nochmal nach einer eleganteren Lösung gefragt hatte.

Schlussendlich funktioniert es aber so wie ich mir das gedacht habe!

Vielen dank für deine freundliche Unterstützung!!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(2)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Per Batch Dateien in einen Ordner - ext. Festplatte übertragen (2)

Frage von tocksick zum Thema Batch & Shell ...

Batch & Shell
Dateien kopieren die nicht mehr verändert werden? (10)

Frage von pbelcl zum Thema Batch & Shell ...

VB for Applications
gelöst Mehrere CSV Dateien aus verschiedenen Ordner einlesen via VBA (12)

Frage von mtufangil zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...