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

Batch - rotierender Zielordner, Variabel für Robocopy Job

Frage Entwicklung Batch & Shell

Mitglied: m.fessler

m.fessler (Level 1) - Jetzt verbinden

20.05.2011, aktualisiert 18.10.2012, 4695 Aufrufe, 12 Kommentare

Hallo,

ich hätte gerne eine Batch Datei gehabt mit einem Robocopy Job
deren Zielordner sich bei jedem Start der Batchdatei ändert.
Das also zB. automatisch immer zwischen 4 verschiedenen Zielordnern rotiert wird.

1x Batch gestartet = Zielordner 1
2x Batch gestartet = Zielordner 2
3x Batch gestartet = Zielordner 3
4x Batch gestartet = Zielordner 4
5x Batch gestartet = Zielordner 1
.
.

Hab das soweit eigentlich schon gelöst aber hmmm najo ziemlich unschön wie ich finde.
Wie könnte man das kürzer/schöner realisieren?

Die bisherige Lösung:
(Eine der Textfiles sowie die möglichen Zielordner müssen bereits erstellt sein.)

01.
@echo off & setlocal 
02.
 
03.
if exist "D:\_batch\4.txt" goto 1 
04.
if exist "D:\_batch\1.txt" goto 2 
05.
if exist "D:\_batch\2.txt" goto 3 
06.
if exist "D:\_batch\3.txt" goto 4 
07.
 
08.
:1 
09.
set var=freitag1 
10.
ren "D:\_batch\4.txt" "1.txt" 
11.
goto copy 
12.
 
13.
:2 
14.
set var=freitag2 
15.
ren "D:\_batch\1.txt" "2.txt" 
16.
goto copy 
17.
 
18.
:3 
19.
set var=freitag3 
20.
ren "D:\_batch\2.txt" "3.txt" 
21.
goto copy 
22.
 
23.
:4 
24.
set var=freitag4 
25.
ren "D:\_batch\3.txt" "4.txt" 
26.
goto copy 
27.
 
28.
 
29.
:copy 
30.
robocopy.exe "D:\_batch\quelle" "D:\_batch\ziel\%var%" /COPYALL /DCOPY:T /MIR /r:0
Danke sehr!
Gruß

Martin
Mitglied: bastla
20.05.2011 um 15:55 Uhr
Hallo m.fessler und willkommen im Forum!

Eigentlich ginge es doch darum, den jeweils ältesten Ordner zu verwenden - daher würde ich es (unter der Annahme, dass bereits alle 4 Ordner existieren) etwa so versuchen:
for /f "delims=" %%i in ('dir /s /ad /o-d "D:\_batch\ziel\freitag?"') do set "var=%%i"
Wenn Du danach den gefundenen Ordner löschst und neu erstellst, sollte das eigentlich klappen ...

Grüße
bastla
Bitte warten ..
Mitglied: m.fessler
20.05.2011 um 17:26 Uhr
Zitat von bastla:
Hallo m.fessler und willkommen im Forum!

Eigentlich ginge es doch darum, den jeweils ältesten Ordner zu verwenden - daher würde ich es (unter der Annahme, dass
bereits alle 4 Ordner existieren) etwa so versuchen:
for /f "delims=" %%i in ('dir /s /ad /o-d 
> "D:\_batch\ziel\freitag?"') do set "var=%%i" 
> 
Wenn Du danach den gefundenen Ordner löschst und neu erstellst, sollte das eigentlich klappen ...

Grüße
bastla
Hallo bastla,

danke schonmal - auch für die Begrüßung!

Habe die 4 Ordner erstellt - jeweils mit einem anderen Datum.
Bekomme aber mit "echo %var%" nur die Antwort "4 Verzeichnis(se), 156.053.147.648 Bytes frei"

Mache ich was falsch?
Bitte warten ..
Mitglied: bastla
20.05.2011 um 17:29 Uhr
Hallo m.fessler!
Mache ich was falsch?
Nein, das mache ich schon selbst - sorry, sollte nicht "/s", sondern "/b" sein - also:
for /f "delims=" %%i in ('dir /b /ad /o-d "D:\_batch\ziel\freitag?"') do set "var=%%i"
Grüße
bastla
Bitte warten ..
Mitglied: m.fessler
20.05.2011 um 18:30 Uhr
Hallo bastla,

funktioniert feinstens! Vielen vielen Dank!
Es wird das Änderungsdatum und nicht das Erstellungsdatum ausgewertet - richtig? Passt aber eh!

Wäre es arg dreist wenn ich fragen würde ob du so nett wärst und kurz beschreiben könntest was er da genau macht?
Möchte nicht nur copy & paste sondern gerne auch dazulernen.

Geht so ein Ein- oder Zweizeiler auch wenn zB. eine vorhergehende zweistellige Nummerierung (01_ordner, 02_ordner...) ausgewertet werden soll
und dann praktisch immer der "nächst höhere" Ordner zum Zuge kommen soll bis zur Zahl X dann soll es wieder von vorne beginnen.
Dann wäre man unabhängig von den Timestamps.

Darum zu bitten wär dann aber wirklich dreist - vielleicht wäre noch jemand anders so nett?

Danke,
Grüße

Martin
Bitte warten ..
Mitglied: bastla
20.05.2011 um 18:49 Uhr
Hallo m.fessler!

Wenn Du Dir mit "dir /?" die Online-Hilfe ansiehst, kannst Du vermutich die meisten Fragen selbst beantworten - um Dir aber trotzdem ein wenig Starthilfe zu geben:
Es wird das Änderungsdatum und nicht das Erstellungsdatum ausgewertet - richtig? Passt aber eh!
"Ändern" lässt sich mit einem zusätzlichen "/tc" ändern
was er da genau macht?
... ist, in einer Schleife ein passend (nach Alter) sortiertes Inhaltverzeichnis nur der Ordner, die der Namens-Vorgabe "freitag + 0 oder 1beliebiges Zeichen" entsprechen, auszugeben, sich dabei auf die Namen zu beschränken (dafür wird "/b" benötigt), und jeweils den aktuellen Namen in %var% zu speichern - natürlich wird dabei der vorherige Inhalt überschrieben, weshalb nach der Schleife der zuletzt ausgegebene Name (deswegen die Sortierung) in %var% verbleibt.
Geht so ein Ein- oder Zweizeiler auch wenn zB. eine vorhergehende zweistellige Nummerierung (01_ordner, 02_ordner...) ausgewertet werden soll
und dann praktisch immer der "nächst höhere" Ordner zum Zuge kommen soll bis zur Zahl X dann soll es wieder von vorne beginnen.
Sortieren kannst Du zwar auch nach Namen, aber Du müsstest ja wissen, welcher Ordner zuletzt verwendet wurde - womit wir wieder beim Timestamp oder einer zusätzlich mitzuführenden Datei für die Nummer wären. Mit einer derartigen Datei könnte das etwa so gehen (als Beispiel für maximal 20 Ordner - siehe Zeile 2):
01.
@echo off & setlocal 
02.
set MaxNr=120 
03.
set "Aktuell=Aktuell.txt" 
04.
set /p Nr=<"%Aktuell%" 
05.
set /a Nr+=1 
06.
if %Nr% gtr %MaxNr% set "Nr=101" 
07.
>"%Aktuell%" echo %Nr% 
08.
set "Ordner=%Nr:~-2%_Ordner" 
09.
echo Naechster Ordner: %Ordner%
Damit das funktionieren kann, muss zunächst die "Aktuell.txt" mit dem Inhalt "100" erstellt werden. Weshalb nicht "00"? Wenn eine Zahl mit "0" beginnt, wird sie als Oktalzahl interpretiert, und da die höchste Ziffer im 8er-System "7" ist, kann mit "08" und "09" nicht gerechnet werden. Als Workaround wird einfach mit drei- (oder auf Wunsch auch mehr-als-drei- ) stelligen Zahlen gerechnet - davon können dann die letzten beiden Stellen (als "Text") auch mit führenden Nullen verwendet werden.

In Zeile 4 siehst Du übrigens die einfachste Möglichkeit, die erste Zeile einer Datei in eine Variable einzulesen (ist nicht unmittelbar der Hilfe mit "set /?" zu entnehmen, sondern ein "Biber-Special").

Daher: Es ist durchaus möglich, die Reihenfolge anhand von Nummern festzulegen, aber Du musst mehr Aufwand dafür treiben ...

Grüße
bastla

[Edit] Anführungszeichen in Zeile 6 ergänzt [/Edit]
Bitte warten ..
Mitglied: m.fessler
20.05.2011 um 22:39 Uhr
Hallo bastla,

ein weiteres Mal: VIELEN DANK!
Kleines Problem noch:
Nach 20 spuckt er "Naechster Ordner: 1 _Ordner" statt "01_Ordner" aus obwohl richtigerweise 101 in der "Aktuell.txt" steht.

Grüße
Martin
Bitte warten ..
Mitglied: bastla
20.05.2011 um 22:46 Uhr
Hallo m.fessler!

Kontrolliere bitte, dass sich am Ende der Zeile 6 kein Leerzeichen befindet - bzw ändere die Zeile (mach ich oben auch gleich) auf
if %Nr% gtr %MaxNr% set "Nr=101"
Grüße
bastla
Bitte warten ..
Mitglied: m.fessler
20.05.2011 um 23:06 Uhr
Leerzeichen entfernt - läuft.

DANKE!

Grüße
Martin
Bitte warten ..
Mitglied: m.fessler
25.05.2011 um 20:37 Uhr
Hallo nochmal,

eine kleine Sache hätte ich noch.
Und zwar möchte ich von einem Laufwerk die Größe sowie den noch freien Speicherplatz als Variabel haben
um diese dann später mit anderem Zeug in die Logfile zu schreiben.

Habe dafür "psinfo" aus den PsTools hergenommen.
Wenn ich es mit "psinfo -d volume" aufrufe erhalte ich folgende Übersicht:

01.
  
02.
PsInfo v1.77 - Local and remote system information viewer 
03.
Copyright (C) 2001-2009 Mark Russinovich 
04.
Sysinternals - www.sysinternals.com 
05.
 
06.
System information for \\USER-PC: 
07.
 
08.
Volume Type       Format     Label                      Size       Free   Free 
09.
    A: Removable                                                          0.0% 
10.
    C: Fixed      NTFS       System                 39.90 GB   26.77 GB  67.1% 
11.
    D: Fixed      NTFS       Daten                  40.00 GB   39.74 GB  99.4% 
12.
    E: CD-ROM                                                             0.0% 
13.
    S: Fixed      NTFS       Sicherung              40.00 GB   35.56 GB  88.9% 
14.
    Z: Removable  NTFS       verschl               465.76 GB  464.83 GB  99.8%
Wenn ich nun die Werte "40.00 GB" + "35.56 GB" vom Volume S: haben möchte... wie gehe ich dann vor?

Das hier habe ich bisher:

01.
 @echo off & setlocal 
02.
for /f "tokens=5" %%i in ('psinfo -d volume^|findstr /c:"S:"') do set "HddSpace=%%i" 
03.
echo. 
04.
echo. 
05.
echo %HddSpace%
Aber leider nimmt er da nur den ersten Wert (zudem ohne GB)... wie bekomme ich den zweiten noch dazu und drehe es zudem noch um?
Sodass ich dann auf "echo %HddSpace%" praktisch folgendes bekomme: 35.56 GB von 40.00 GB frei
Und soll ich statt dem psinfo ein anderes Tool (welches?) nehmen die mir die Antwort liefern könnte?

Danke,
Grüße

Martin
Bitte warten ..
Mitglied: bastla
25.05.2011, aktualisiert 18.10.2012
Hallo m.fessler!

Abgesehen davon, dass diese Zusatzfrage nur schwer unter den Threadtitel zu subsumieren ist, hatten wir Ähnliches mal hier ...

... aber konkret zu Deiner Zeile:
for /f "tokens=5-9" %%i in ('psinfo -d volume 2^>nul ^|findstr /c:"S:"')do echo %%i %%j %%k %%l %%m
Grüße
bastla
Bitte warten ..
Mitglied: m.fessler
25.05.2011 um 22:15 Uhr
Hallo bastla,

ja war mir nicht ganz sicher ob neuer Thread oder doch lieber kurz hier noch mal nachhaken da ich doch schon ziemlich nah
dran, und doch so weit weg war.
Derweil wärs gar nicht nötig gewesen.. hatte ich nicht gefunden - sorry.

Nochmals danke für die Hilfe - funktioniert perfekt.

Grüße
Martin
Bitte warten ..
Mitglied: m.fessler
26.05.2011 um 23:58 Uhr
Kleiner Zusatz noch falls jemand das auch wie ich mit Robocopy verwenden möchte.

Wenn man ein ganzes Laufwerk als Quelle angibt und ua. auch die Ordner Timestamps überträgt so erhält der Zielordner
das Änderungs- sowie das Erstellungsdatum des Quell Laufwerks.

Wenn nun im Root des Quell Laufwerks wenig passiert weil zB. vorwiegend in Unterordnern gearbeitet wird so erhält man
recht "alte" Timestamps sodass obige Ordnerrotation nicht mehr korrekt funktioniert.

Habe es nachdem ich auf die schnelle kein Command Line Tool um die Ordner Timestamps zu ändern gefunden habe
so gelöst dass ich am Ende im Zielordner eine temp. Textdatei erstelle und die auch gleich wieder lösche.
So bekommt der Zielordner das aktuelle Datum als Änderungsdatum und alles ist in Butter.

Schöner als diese Pfuschlösung wäre es die Timestamps des Zielordners nach dem Kopiervorgang anzupassen.
"DirDate" wäre zB. so ein Tool - kostet allerdings gut 20 USD.
Was anderes habe ich leider nicht gefunden.

Grüße
Martin
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (27)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (20)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...