Top-Themen

Aktuelle Themen (A bis Z)

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, 2311 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 ..
Ähnliche Inhalte
Batch & Shell
Dateien rekursiv kopieren und Datum in Dateiname einfügen
gelöst Frage von Franc79Batch & Shell2 Kommentare

Habe mich gerade hier angemeldet, weil ich glaube, hier Hilfe zu bekommen. Frage aktualisiert (15.02. 17:30) Mein Ziel ist ...

Batch & Shell
Ordner durchsuchen und Dateien kopieren
gelöst Frage von friedensbringerBatch & Shell4 Kommentare

Hallo zusammen, gibt es mittels Batchfile eine Möglichkeit in einem definierten Ordner inklusive allen Unterordnern (mehrere Ebenen möglich) nach ...

Batch & Shell
Ordner nach Dateien absuchen und kopieren
Frage von sbsnewbieBatch & Shell4 Kommentare

Moin Leude, folgende Frage: Ich möchte eine kleine batch bauen um ein Verezeichniss nach Dateien abzusuchen und in eine ...

Batch & Shell
Dateien in einem Verzeichnis mergen - rekursiv
gelöst Frage von frad1980Batch & Shell10 Kommentare

HAllo, ich habe folgende Ordner Struktur: 100 200 300 usw. In jedem Ordner sind PDF Dateien abgelegt. Mittels einem ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 106 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 2 TagenInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 2 TagenDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
Frage von HelloWorldBatch & Shell16 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

Windows Server
Ping auf einen bestimmten Server nicht möglich
gelöst Frage von a.thierWindows Server7 Kommentare

Hallo, ich habe folgendes Problem. srv-dc1: Ping srv-nav > geht Ping srv-exchange > geht nicht srv-exchange: Ping srv-dc1 > ...

Hardware
Fujitsu Workstation mit K80 und Quadro P5000, Fehlermeldung: Connect Power Adapter
Frage von MachelloHardware7 Kommentare

Hallo Zusammen, ich benötige euren Rat da ich ratlos bin. Folgende Konfiguration im Büro: Fujitsu Workstation Celcius R940 Power ...