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

Verschieben von bestimmter Anzahl von Dateien aus vollem Ordner dauert zu lange

Frage Entwicklung Batch & Shell

Mitglied: mkdeluxe

mkdeluxe (Level 1) - Jetzt verbinden

19.02.2015, aktualisiert 20.02.2015, 674 Aufrufe, 2 Kommentare

Hallo zusammen,

ich hoffe ihr könnt mir helfen, ich bin nach langer Zeit mal wieder im Batch-Umfeld unterwegs (sonst eher C# u.ä.) und benötige ein Script, mit dessen Hilfe ich eine bestimmte Anzahl von Dateien von einem in ein anderes Verzeichnis verschiebe. Wichtig ist, dass immer die ältesten zuerst verschoben werden. Wenn die definierte Anzahl an Files verschoben wurde, soll das Script beendet werden.

Mein Lösung (siehe unten) verschiebt zwar die gewünschten Files in das gewünschte Verzeichnis, läuft aber danach noch lange weiter, da das Ausgangsverzeichnis sehr voll ist und der ELSE-Zweig mit dem goto :eof nicht greift. Ich hoffe auf eure Hilfe...

01.
set StartFolder=C:\DATA\Test\ 
02.
set TargetFolder="C:\DATA\Test2\" 
03.
set SearchString="Update*.xml" 
04.
set Found="" 
05.
set /a Numbers=1 
06.
set Count=1000 
07.
 
08.
FOR /F "delims=" %%z IN ('dir %StartFolder%%SearchString% /OD /B') Do @( 
09.
	IF %Numbers% LEQ %Count% ( 
10.
		call :MoveFile "%%z" 
11.
		) ELSE ( GOTO :EOF	) 
12.
13.
 
14.
:MOVEFile 
15.
SET Found="%~1" 
16.
IF %Numbers% LEQ %Count% (MOVE %StartFolder%%Found% %TargetFolder% 
17.
SET /a Numbers= %Numbers%+1 )
Wie kann ich das besser lösen? Wo ist der Fehler im Ansatz? Könnt ihr mich anschubsen?

Danke für die Hilfe und viele Grüße
Mitglied: rubberman
LÖSUNG 19.02.2015, aktualisiert 20.02.2015
Hallo mkdeluxe.

  • Die FOR /F Schleife puffert zunächst die gesamte Ausgabe des DIR Befehls, bevor der Schleifenrumpf überhaupt abgearbeitet wird. Das wirst du nicht vermeiden können, da du die Ausgabe mit /OD vorsortiert haben möchtest.
  • Der Aufruf einer Subroutine kostet Zeit. Wenn du alles im Schleifenrumpf abarbeitest, wird das etwas schneller gehen.
  • Variablen werden in einer Kommandozeile oder einem (in Klammern eingeschlossenen) Block von Kommandozeilen nur einmal zum Wert erweitert, und zwar noch vor der Abarbeitung dieses Codes. Dein Schleifenrumpf ist so ein Block, deshalb bleibt %Numbers% beim Vergleich auch immer 1. Die "Verzögerte Variablenerweiterung" schafft Abhilfe.

Ungetestet:
01.
@echo off &setlocal 
02.
set "StartFolder=C:\DATA\Test\" 
03.
set "TargetFolder=C:\DATA\Test2\" 
04.
set "SearchString=Update*.xml" 
05.
set /a "Numbers=1, Count=1000" 
06.
 
07.
for /F "delims=" %%z in ('dir "%StartFolder%%SearchString%" /OD /B') do ( 
08.
  set "Found=%%z" 
09.
  setlocal EnableDelayedExpansion 
10.
  if !Numbers! LEQ !Count! ( 
11.
    move "!StartFolder!!Found!" "!TargetFolder!" 
12.
  ) else ( 
13.
    goto :EOF 
14.
15.
  endlocal 
16.
  set /a "Numbers += 1" 
17.
)
Grüße
rubberman
Bitte warten ..
Mitglied: mkdeluxe
20.02.2015 um 09:30 Uhr
Hallo rubberman,

danke für die Hilfe! Es funktioniert wie gewünscht. "EnableDelayedExpansion"... das erklärt vieles! Danke für die Lösung und für die Erklärungen!

Grüße
mkdeluxe
Bitte warten ..
Neuester Wissensbeitrag
Microsoft Office

MS Office Excel - Formel wird angezeigt, aber nicht berechneter Wert!

Tipp von holli.zimmi zum Thema Microsoft Office ...

Ähnliche Inhalte
Batch & Shell
gelöst Dateien in Ordner verschiebenm abhängig vom Jahr des Änderungsdatums (11)

Frage von freakonaleash zum Thema Batch & Shell ...

Windows 7
Dateien und Ordner vernünftig organisieren (5)

Frage von blackhawk17 zum Thema Windows 7 ...

C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Heiß diskutierte Inhalte
Exchange Server
Bestehende eMails autoamatisch weiterleiten (21)

Frage von metal-shot zum Thema Exchange Server ...

Hyper-V
gelöst Reiner Hyper- V Server oder lieber Rolle (21)

Frage von Winuser zum Thema Hyper-V ...

SAN, NAS, DAS
gelöst Synology Version 6.1 Probleme (18)

Frage von Hendrik2586 zum Thema SAN, NAS, DAS ...

Router & Routing
gelöst IP Kamera für drei unabhängige Netzwerke (16)

Frage von ProfessorZ zum Thema Router & Routing ...