
115129
20.02.2014, aktualisiert am 21.02.2014
Dateien in einem Lokalordner verschieben auf Netzwerk-HDD, aber nur wenn Restkapazität auf Netzwerk-HDD ausreicht.
Hallo,
wie würde ein Batch-Script aussehen, das folgende Funktion erfüllen soll:
Verschiebe alle Dateien in C:\Test\ nach \\USB\HDD\ (ist eine Festplatte im Netzwerk), aber nur wenn Gesamtgröße der zu verschiebenden Dateien auf Netzwerk-HDD (3TB) mit bereits vorhandenen Dateien passt.
Ich bin mir nicht 100% sicher, ich meine irgendwo gelesen zu haben, dass die Festplattengröße einer Netzwerk-HDD nicht übers Netzwerk ausgelesen werden kann...kann mich auch täuschen.
Bei meiner hab ich`s versucht, unter Eigenschaften bekomme ich 0Bytes angezeigt, aber vielleicht kommt man doch irgendwie dran?
Gibt's hierzu eine Lösung?
Mein derzeitiges Script sieht so aus:
Vielen Dank schon mal 
Grüße
wie würde ein Batch-Script aussehen, das folgende Funktion erfüllen soll:
Verschiebe alle Dateien in C:\Test\ nach \\USB\HDD\ (ist eine Festplatte im Netzwerk), aber nur wenn Gesamtgröße der zu verschiebenden Dateien auf Netzwerk-HDD (3TB) mit bereits vorhandenen Dateien passt.
1. Ist \\USB\HDD\ erreichbar, wenn nicht nichts tun!
2. Prüfe C:\Test\ auf Inhaltsgröße
3. Prüfe \\USB\HDD\ auf Inhaltsgröße
4. Reicht Restkapazität von \\USB\HDD\ nicht aus, nichts tun!
5. Reicht Restkapazität von \\USB\HDD\ aus verschiebe Inhalt C:\Test\ nach \\USB\HDD\
Bei meiner hab ich`s versucht, unter Eigenschaften bekomme ich 0Bytes angezeigt, aber vielleicht kommt man doch irgendwie dran?
Gibt's hierzu eine Lösung?
Mein derzeitiges Script sieht so aus:
@echo off
if exist \\USB\HDD goto MOVE
if not exist \\USB\HDD goto END
:MOVE
set mypath1=C:\Test
set mypath2=\\USB\HDD
for %%i in ("%mypath1%\*.*") do move "%%i" "%mypath2%"
:END
Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 230554
Url: https://administrator.de/forum/dateien-in-einem-lokalordner-verschieben-auf-netzwerk-hdd-aber-nur-wenn-restkapazitaet-auf-netzwerk-hdd-230554.html
Ausgedruckt am: 20.04.2025 um 12:04 Uhr
16 Kommentare
Neuester Kommentar
Hallo,
- während du fleißig kopierst jemand anders schnell noch was drauf pappt (Zeitfaktor?)
- viele (kleine) Dateien hast die (zu viele) Sektoren belegen und damit deinen Platz aufbrauchen obwohl nur wenig von den Sektoren in Byte tatsächlich gebraucht wird? (Sektoren Größe)
Nur meine 2 Gedanken....
Gruß,
Peter
Zitat von @115129:
Ich bin mir nicht 100% sicher, ich meine irgendwo gelesen zu haben, dass die Festplattengröße einer Netzwerk-HDD nicht übers Netzwerk ausgelesen werden kann...kann mich auch täuschen.
Das hängt aber auch von den OSen ab ob du überhaupt diese Info bekommst. Aber davon abgesehen, was ist wenn Platz zwar da, aber er trotzdem nicht reicht weilIch bin mir nicht 100% sicher, ich meine irgendwo gelesen zu haben, dass die Festplattengröße einer Netzwerk-HDD nicht übers Netzwerk ausgelesen werden kann...kann mich auch täuschen.
- während du fleißig kopierst jemand anders schnell noch was drauf pappt (Zeitfaktor?)
- viele (kleine) Dateien hast die (zu viele) Sektoren belegen und damit deinen Platz aufbrauchen obwohl nur wenig von den Sektoren in Byte tatsächlich gebraucht wird? (Sektoren Größe)
Nur meine 2 Gedanken....
Gruß,
Peter
Zitat von @115129:
Nutze keine windowseigene Sharefunktion (Windows Mediashare oder wie das heißt), habe manuelle Ordnerfreigaben und
Berechtigungen gesetzt.
Das meine ich, "Freigaben", wenn du am Server angemeldet bist bekommst du den freien Platz der Freigabe: "Nutze keine windowseigene Sharefunktion (Windows Mediashare oder wie das heißt), habe manuelle Ordnerfreigaben und
Berechtigungen gesetzt.
dir \\ComputerName\FreigabeName
".Bist du den Sprachen VB oder PS ebenso mächtig?
Leider nicht.Gruss.
Hallo,
Gruß,
Peter
Zitat von @115129:
allerdings lokal nicht übers Netzwerk (grad nicht zu Haus):
Was dann auch mit der Ausgabe (Rückgabe) deiner Netzwerk-HDD nicht übereinstimmen muss. Wir kennen noch nicht mal deine beteiligten Betreibssysteme um erkennen zu können wie diese dir deine Netzwerk-HDD bereitstellen und was dir bei einem Zugriff darauf an Informationen zurückgegeben werden.allerdings lokal nicht übers Netzwerk (grad nicht zu Haus):
Wäre es möglich die Zeile "2 Verzeichnis(se), 182.986.862.592 Bytes frei" auszulesen und den Wert 182.986.862.592 Bytes für den Vergleich zu verwenden?
Ja. Find ist dein Freund und du solltest dann nach "Bytes Frei" oder "Bytes free" oder soetwas suchen, was immer deine Netzwerk-HDD dir da anbietet. Und ja, je nach Betriebssystem und Sprache kann da auch ganz was anderes stehen.Oder rätst du definitiv zu einer anderen Sprache für diese Anwendung?
Batch war noch nie gut in Rechnen, aber es kann. Schaust du Rechnen in BatchGruß,
Peter
Zitat von @115129:
Wäre es möglich die Zeile "2 Verzeichnis(se), 182.986.862.592 Bytes frei" auszulesen und den Wert
182.986.862.592 Bytes für den Vergleich zu verwenden?
Ja:Wäre es möglich die Zeile "2 Verzeichnis(se), 182.986.862.592 Bytes frei" auszulesen und den Wert
182.986.862.592 Bytes für den Vergleich zu verwenden?
@ECHO OFF &SETLOCAL disableDelayedExpansion
FOR /f "tokens=3" %%a IN ('DIR /-c') DO SET "FreeBytes=%%a"
ECHO(%FreeBytes%
Hallo BlattlausOG,
Batchscript ist im Zeitalter von Zig-Gigabyte-Festplatten für die Lösung Deines Problems nicht geeignet. Die Krux steht auch in dem von @Pjordorf verlinkten Beitrag:
Positive Werte haben somit nur einen Wertebereich bis 2^31 - 1 = 2.147.483.647. Daher würde schon der freie Festplattenplatz aus Deinem Beispiel die Batch-Arithmetik auf die Bretter schicken, denn solch einen Wert könnte man auch nicht durch Division mit 1024 für die weitere Verarbeitung kleiner machen.
Deshalb hier ein Vorschlag mit einem Inline-VBScript, das nur ermittelt, ob auf dem Ziel genug freier Platz vorhanden ist:
Die Zeilen 3 und 4 musst Du anpassen.
Gruss
Friemler
Batchscript ist im Zeitalter von Zig-Gigabyte-Festplatten für die Lösung Deines Problems nicht geeignet. Die Krux steht auch in dem von @Pjordorf verlinkten Beitrag:
32Bit-Integer mit negativen Ergebnissen
Positive Werte haben somit nur einen Wertebereich bis 2^31 - 1 = 2.147.483.647. Daher würde schon der freie Festplattenplatz aus Deinem Beispiel die Batch-Arithmetik auf die Bretter schicken, denn solch einen Wert könnte man auch nicht durch Division mit 1024 für die weitere Verarbeitung kleiner machen.
Deshalb hier ein Vorschlag mit einem Inline-VBScript, das nur ermittelt, ob auf dem Ziel genug freier Platz vorhanden ist:
@echo off & setlocal
set "SrcPath=C:\Test"
set "DstPath=\\USB\HDD"
set "VBScript=%TEMP%\DestFitsSize.vbs"
> "%VBScript%" echo Set objFSO = CreateObject("Scripting.FileSystemObject")
>>"%VBScript%" echo.
>>"%VBScript%" echo strSrcPath = WScript.Arguments(0)
>>"%VBScript%" echo strDstPath = WScript.Arguments(1)
>>"%VBScript%" echo.
>>"%VBScript%" echo dblSrcSize = objFSO.GetFolder(strSrcPath).Size
>>"%VBScript%" echo dblDstSize = objFSO.GetDrive(objFSO.GetDriveName(strDstPath)).FreeSpace
>>"%VBScript%" echo.
>>"%VBScript%" echo If dblDstSize ^> dblSrcSize Then
>>"%VBScript%" echo WScript.Quit 0
>>"%VBScript%" echo Else
>>"%VBScript%" echo WScript.Quit 1
>>"%VBScript%" echo End If
if not exist "%DstPath%" goto :Terminate
cscript /nologo "%VBScript%" "%SrcPath%" "%DstPath%" || goto :Terminate
for %%i in ("%SrcPath%\*.*") do move "%%i" "%DstPath%"
:Terminate
del "%VBScript%"
Die Zeilen 3 und 4 musst Du anpassen.
Gruss
Friemler
Zitat von @Friemler:
Hallo BlattlausOG,
Batchscript ist im Zeitalter von Zig-Gigabyte-Festplatten für die Lösung Deines Problems nicht geeignet.
Hallo BlattlausOG,
Batchscript ist im Zeitalter von Zig-Gigabyte-Festplatten für die Lösung Deines Problems nicht geeignet.
Das würd ich so apodiktisch nicht sehen.
Aber weil bald Wochenende ist mag ich den Beweis jetzt nicht führen
Gruss.
Hallo Endoro,
schon klar, man könnte auch sowas benutzen:
Aber was ist, wenn das Quellverzeichnis ein verschachtelter Verzeichnisbaum mit Unterverzeichnissen ist? Die Größe der dort enthaltenen Dateien kann man aufgrund der beschränkten Möglichkeiten der Batch-Arithmetik durch rekursives Durchwandern des Verzeichnisbaums und Addition der Dateigrößen in den einzelnen Verzeichnissen nicht ermitteln. Der obige VBScript-Schnipsel muss dazu noch nicht einmal geändert werden.
Außerdem lauert bei der Batch-Lösung noch das Problem, dass man sich auf ein deutsches Windows festlegt:
Alles mit Batchscript zu lösen ist zwar eine sportliche Herausforderung, man muss aber schon aufpassen, dass da nicht der Spieltrieb mit einem durchgeht.
Gruß
Friemler
schon klar, man könnte auch sowas benutzen:
@echo off & setlocal
set "SrcPath=C:\Test"
set "DstPath=\\USB\HDD"
if not exist "%DstPath%" goto :EOF
for /f "tokens=3" %%s in ('dir /d /-c "%SrcPath%" ^| find /i "Datei(en)"') do set "SrcSize=0000000000000000000%%s"
for /f "tokens=3" %%d in ('dir /d /-c "%DstPath%" ^| find /i "Verzeichnis(se)"') do set "DstSize=0000000000000000000%%d"
set "SrcSize=%SrcSize:~-20%"
set "DstSize=%DstSize:~-20%"
if "%DstSize%" gtr "%SrcSize%" (
for %%i in ("%SrcPath%\*.*") do move "%%i" "%DstPath%"
)
Aber was ist, wenn das Quellverzeichnis ein verschachtelter Verzeichnisbaum mit Unterverzeichnissen ist? Die Größe der dort enthaltenen Dateien kann man aufgrund der beschränkten Möglichkeiten der Batch-Arithmetik durch rekursives Durchwandern des Verzeichnisbaums und Addition der Dateigrößen in den einzelnen Verzeichnissen nicht ermitteln. Der obige VBScript-Schnipsel muss dazu noch nicht einmal geändert werden.
Außerdem lauert bei der Batch-Lösung noch das Problem, dass man sich auf ein deutsches Windows festlegt:
find /i "Datei(en)"
Alles mit Batchscript zu lösen ist zwar eine sportliche Herausforderung, man muss aber schon aufpassen, dass da nicht der Spieltrieb mit einem durchgeht.
Gruß
Friemler
Hallo @Friemler,
Ja genau, es geht sogar noch schicker.
Doch,
Keineswegs:
Aber du hast insofern recht, als dass es mit einem koreanischen Windows vielleicht nicht läuft.
Dafür lieben wir es, dafür tun wir es
Gruss, und schönes Wochenende!
Ja genau, es geht sogar noch schicker.
Aber was ist, wenn das Quellverzeichnis ein verschachtelter Verzeichnisbaum mit Unterverzeichnissen ist? Die Größe der
dort enthaltenen Dateien kann man aufgrund der beschränkten Möglichkeiten der Batch-Arithmetik durch rekursives
Durchwandern des Verzeichnisbaums und Addition der Dateigrößen in den einzelnen Verzeichnissen nicht ermitteln.
dort enthaltenen Dateien kann man aufgrund der beschränkten Möglichkeiten der Batch-Arithmetik durch rekursives
Durchwandern des Verzeichnisbaums und Addition der Dateigrößen in den einzelnen Verzeichnissen nicht ermitteln.
Doch,
dir /s
zeigt das für einen Verzeichnisbaum richtig an. Zur Not könnte man noch Links/Junctions anlegen, wenn es um mehrere geht.Außerdem lauert bei der Batch-Lösung noch das Problem, dass man sich auf ein deutsches Windows festlegt:
Keineswegs:
@ECHO OFF &SETLOCAL disableDelayedExpansion
FOR /f "tokens=3" %%a IN ('DIR /-c /s') DO (
CALL SET "FileSize=%%FreeBytes%%"
SET "FreeBytes=%%a"
)
ECHO(%FileSize%
Alles mit Batchscript zu lösen ist zwar eine sportliche Herausforderung, man muss aber schon aufpassen, dass da nicht der Spieltrieb mit einem durchgeht.
Dafür lieben wir es, dafür tun wir es
Gruss, und schönes Wochenende!
Auch wieder wahr.
Auch Dir ein schönes WE.
Gruß
Friemler