m.fessler
Goto Top

Batch - rotierender Zielordner, Variabel für Robocopy Job

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.)

@echo off & setlocal

if exist "D:\_batch\4.txt" goto 1  
if exist "D:\_batch\1.txt" goto 2  
if exist "D:\_batch\2.txt" goto 3  
if exist {{comment_strings:13028453687}} goto 4 

:1
set var=freitag1
ren "D:\_batch\4.txt" "1.txt"  
goto copy

:2
set var=freitag2
ren "D:\_batch\1.txt" "2.txt"  
goto copy

:3
set var=freitag3
ren "D:\_batch\2.txt" {{comment_strings:23271071295}}  
goto copy

:4
set var=freitag4
ren {{comment_strings:12559244214}} {{comment_strings:31961993294}} 
goto copy


:copy
robocopy.exe {{comment_strings:33099490004}} {{comment_strings:3523555323}} /COPYALL /DCOPY:T /MIR /r:0 

Danke sehr!
Gruß

Martin

Content-Key: 166645

Url: https://administrator.de/contentid/166645

Printed on: April 16, 2024 at 13:04 o'clock

Member: bastla
bastla May 20, 2011 at 13:55:32 (UTC)
Goto Top
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
Member: m.fessler
m.fessler May 20, 2011 at 15:26:39 (UTC)
Goto Top
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?
Member: bastla
bastla May 20, 2011 at 15:29:33 (UTC)
Goto Top
Hallo m.fessler!
Mache ich was falsch?
Nein, das mache ich schon selbst face-wink - 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
Member: m.fessler
m.fessler May 20, 2011 at 16:30:45 (UTC)
Goto Top
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
Member: bastla
bastla May 20, 2011 at 16:49:48 (UTC)
Goto Top
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 face-wink
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):
@echo off & setlocal
set MaxNr=120
set "Aktuell=Aktuell.txt"  
set /p Nr=<"%Aktuell%"  
set /a Nr+=1
if %Nr% gtr %MaxNr% set "Nr=101"  
>"%Aktuell%" echo %Nr%  
set "Ordner=%Nr:~-2%_Ordner"  
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- face-wink) 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]
Member: m.fessler
m.fessler May 20, 2011 at 20:39:22 (UTC)
Goto Top
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
Member: bastla
bastla May 20, 2011 at 20:46:12 (UTC)
Goto Top
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
Member: m.fessler
m.fessler May 20, 2011 at 21:06:33 (UTC)
Goto Top
Leerzeichen entfernt - läuft.

DANKE!

Grüße
Martin
Member: m.fessler
m.fessler May 25, 2011 at 18:37:43 (UTC)
Goto Top
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:

 
PsInfo v1.77 - Local and remote system information viewer
Copyright (C) 2001-2009 Mark Russinovich
Sysinternals - www.sysinternals.com

System information for \\USER-PC:

Volume Type       Format     Label                      Size       Free   Free
    A: Removable                                                          0.0%
    C: Fixed      NTFS       System                 39.90 GB   26.77 GB  67.1%
    D: Fixed      NTFS       Daten                  40.00 GB   39.74 GB  99.4%
    E: CD-ROM                                                             0.0%
    S: Fixed      NTFS       Sicherung              40.00 GB   35.56 GB  88.9%
    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:

 @echo off & setlocal
for /f "tokens=5" %%i in ('psinfo -d volume^|findstr /c:"S:"') do set "HddSpace=%%i"  
echo.
echo.
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
Member: bastla
bastla May 25, 2011, updated at Oct 18, 2012 at 16:46:59 (UTC)
Goto Top
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
Member: m.fessler
m.fessler May 25, 2011 at 20:15:55 (UTC)
Goto Top
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 face-smile 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
Member: m.fessler
m.fessler May 26, 2011 at 21:58:38 (UTC)
Goto Top
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