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

Dateien in einem Lokalordner verschieben auf Netzwerk-HDD, aber nur wenn Restkapazität auf Netzwerk-HDD ausreicht.

Frage Entwicklung Batch & Shell

Mitglied: BlattlausOG

BlattlausOG (Level 1) - Jetzt verbinden

20.02.2014, aktualisiert 21.02.2014, 1547 Aufrufe, 16 Kommentare

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.
01.
1. Ist \\USB\HDD\ erreichbar, wenn nicht nichts tun! 
02.
2. Prüfe C:\Test\ auf Inhaltsgröße 
03.
3. Prüfe \\USB\HDD\ auf Inhaltsgröße 
04.
4. Reicht Restkapazität von \\USB\HDD\ nicht aus, nichts tun! 
05.
5. Reicht Restkapazität von \\USB\HDD\ aus verschiebe Inhalt C:\Test\ nach \\USB\HDD\
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:
01.
@echo off 
02.
if exist \\USB\HDD goto MOVE 
03.
if not exist \\USB\HDD goto END 
04.
 
05.
:MOVE 
06.
set mypath1=C:\Test 
07.
set mypath2=\\USB\HDD  
08.
for %%i in ("%mypath1%\*.*") do move "%%i" "%mypath2%" 
09.
 
10.
:END
Vielen Dank schon mal

Grüße
Mitglied: Pjordorf
21.02.2014 um 01:55 Uhr
Hallo,

Zitat von BlattlausOG:
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 weil
- 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
Bitte warten ..
Mitglied: Endoro
21.02.2014 um 02:23 Uhr
Hey,

wenn du über Windows Shares im "Heimnetzwerk" gehst (net use usw.), bekommst du auch den freien Platz "dir \\ComputerName\ShareName". Wegen der Rechnerei ist pure batch hier nicht besonders praktisch; VB oder PS böte sich an.
Gruss.
Bitte warten ..
Mitglied: BlattlausOG
21.02.2014, aktualisiert um 09:05 Uhr
Hallo Pjordorf,

- während du fleißig kopierst jemand anders schnell noch was drauf pappt (Zeitfaktor?)
...passiert nicht, ich bin der einzigste der verschieben darf und das soll nur über das Script passieren.

- 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)
...die Dateien die verschoben werden sind >500MB, zum anderen wenn das Script gestartet wird soll es Speicherplatz erfassen und wenn genug Platz vorhanden verschieben.

Grüße
Bitte warten ..
Mitglied: BlattlausOG
21.02.2014 um 08:55 Uhr
Hi Endoro,

nach so kurzer Zeit lese ich wieder von dir

wenn du über Windows Shares im "Heimnetzwerk" gehst (net use usw.), bekommst du auch den freien Platz
"dir \\ComputerName\ShareName". Wegen der Rechnerei ist pure batch hier nicht besonders praktisch; VB oder PS
böte sich an.
Nutze keine windowseigene Sharefunktion (Windows Mediashare oder wie das heißt), habe manuelle Ordnerfreigaben und Berechtigungen gesetzt.

Bist du den Sprachen VB oder PS ebenso mächtig? Dann lass mich ein Script testen

Grüße
Bitte warten ..
Mitglied: Endoro
21.02.2014 um 11:06 Uhr
Zitat von BlattlausOG:
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: "dir \\ComputerName\FreigabeName".

Bist du den Sprachen VB oder PS ebenso mächtig?
Leider nicht.
Gruss.
Bitte warten ..
Mitglied: BlattlausOG
21.02.2014 um 11:10 Uhr
Hi Endoro,

Das meine ich, "Freigaben", wenn du am Server angemeldet bist bekommst du den freien Platz der Freigabe: "dir
\\ComputerName\FreigabeName
"
Somit bekomme ich doch nur den Inhalt nicht aber die Kapazität gelistet!?
Bitte warten ..
Mitglied: Endoro
21.02.2014 um 11:51 Uhr
Nö, in der letzten Zeile steht "xx Bytes frei".
Bitte warten ..
Mitglied: BlattlausOG
21.02.2014 um 12:16 Uhr
Zitat von Endoro:

Nö, in der letzten Zeile steht "xx Bytes frei".
Stimmt :p
Habe nun mal testweise ein Verzeichnis angelegt und ausgelesen (Teilausschnitt), allerdings lokal nicht übers Netzwerk (grad nicht zu Haus):
01.
22.03.2012  18:34           711.552 DSC_0979.JPG 
02.
22.03.2012  18:38           714.673 DSC_0987.JPG 
03.
03.04.2012  06:16           642.990 DSC_0988.JPG 
04.
22.03.2012  18:41           699.108 DSC_0998.JPG 
05.
              92 Datei(en),     70.421.926 Bytes 
06.
               2 Verzeichnis(se), 182.986.862.592 Bytes frei
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?
Oder rätst du definitiv zu einer anderen Sprache für diese Anwendung?

Grüße
Bitte warten ..
Mitglied: Pjordorf
21.02.2014 um 12:46 Uhr
Hallo,

Zitat von BlattlausOG:
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.

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 http://www.administrator.de/wissen/rechnen-in-batch-125284.html

Gruß,
Peter
Bitte warten ..
Mitglied: Endoro
21.02.2014, aktualisiert um 13:33 Uhr
Zitat von BlattlausOG:
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:
01.
@ECHO OFF &SETLOCAL disableDelayedExpansion 
02.
FOR /f "tokens=3" %%a IN ('DIR /-c') DO SET "FreeBytes=%%a" 
03.
ECHO(%FreeBytes%
Zum Vergleichen muss nicht zwingend gerechnet werden.
Bitte warten ..
Mitglied: Friemler
LÖSUNG 21.02.2014, aktualisiert um 17:27 Uhr
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:
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:
01.
@echo off & setlocal 
02.
 
03.
set "SrcPath=C:\Test" 
04.
set "DstPath=\\USB\HDD" 
05.
 
06.
 
07.
set "VBScript=%TEMP%\DestFitsSize.vbs" 
08.
 
09.
> "%VBScript%" echo Set objFSO = CreateObject("Scripting.FileSystemObject") 
10.
>>"%VBScript%" echo. 
11.
>>"%VBScript%" echo strSrcPath = WScript.Arguments(0) 
12.
>>"%VBScript%" echo strDstPath = WScript.Arguments(1) 
13.
>>"%VBScript%" echo. 
14.
>>"%VBScript%" echo dblSrcSize = objFSO.GetFolder(strSrcPath).Size 
15.
>>"%VBScript%" echo dblDstSize = objFSO.GetDrive(objFSO.GetDriveName(strDstPath)).FreeSpace 
16.
>>"%VBScript%" echo. 
17.
>>"%VBScript%" echo If dblDstSize ^> dblSrcSize Then 
18.
>>"%VBScript%" echo   WScript.Quit 0 
19.
>>"%VBScript%" echo Else 
20.
>>"%VBScript%" echo   WScript.Quit 1 
21.
>>"%VBScript%" echo End If 
22.
 
23.
 
24.
if not exist "%DstPath%" goto :Terminate 
25.
cscript /nologo "%VBScript%" "%SrcPath%" "%DstPath%" || goto :Terminate 
26.
for %%i in ("%SrcPath%\*.*") do move "%%i" "%DstPath%" 
27.
 
28.
 
29.
:Terminate 
30.
del "%VBScript%"
Die Zeilen 3 und 4 musst Du anpassen.

Gruss
Friemler
Bitte warten ..
Mitglied: Endoro
21.02.2014 um 14:59 Uhr
Zitat von Friemler:

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.
Bitte warten ..
Mitglied: Friemler
21.02.2014 um 15:49 Uhr
Hallo Endoro,

schon klar, man könnte auch sowas benutzen:
01.
@echo off & setlocal 
02.
 
03.
set "SrcPath=C:\Test" 
04.
set "DstPath=\\USB\HDD" 
05.
 
06.
if not exist "%DstPath%" goto :EOF 
07.
 
08.
for /f "tokens=3" %%s in ('dir /d /-c "%SrcPath%" ^| find /i "Datei(en)"') do set "SrcSize=0000000000000000000%%s" 
09.
for /f "tokens=3" %%d in ('dir /d /-c "%DstPath%" ^| find /i "Verzeichnis(se)"') do set "DstSize=0000000000000000000%%d" 
10.
 
11.
set "SrcSize=%SrcSize:~-20%" 
12.
set "DstSize=%DstSize:~-20%" 
13.
 
14.
if "%DstSize%" gtr "%SrcSize%" ( 
15.
  for %%i in ("%SrcPath%\*.*") do move "%%i" "%DstPath%" 
16.
)
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
Bitte warten ..
Mitglied: Endoro
21.02.2014 um 16:24 Uhr
Hallo @Friemler,

Zitat von Friemler:

Hallo Endoro,

schon klar, man könnte auch sowas benutzen:

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.

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:
01.
@ECHO OFF &SETLOCAL disableDelayedExpansion 
02.
FOR /f "tokens=3" %%a IN ('DIR /-c /s') DO ( 
03.
	CALL SET "FileSize=%%FreeBytes%%" 
04.
	SET "FreeBytes=%%a" 
05.
06.
ECHO(%FileSize%
Aber du hast insofern recht, als dass es mit einem koreanischen Windows vielleicht nicht läuft.

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!
Bitte warten ..
Mitglied: Friemler
21.02.2014 um 17:25 Uhr
Zitat von Endoro:

Dafür lieben wir es, dafür tun wir es

Auch wieder wahr.

Auch Dir ein schönes WE.

Gruß
Friemler
Bitte warten ..
Mitglied: BlattlausOG
21.02.2014, aktualisiert um 17:30 Uhr
01.
> @echo off & setlocal 
02.
>  
03.
> set "SrcPath=C:\Test" 
04.
> set "DstPath=\\USB\HDD" 
05.
>  
06.
>  
07.
> set "VBScript=%TEMP%\DestFitsSize.vbs" 
08.
>  
09.
> > "%VBScript%" echo Set objFSO = CreateObject("Scripting.FileSystemObject") 
10.
> >>"%VBScript%" echo. 
11.
> >>"%VBScript%" echo strSrcPath = WScript.Arguments(0) 
12.
> >>"%VBScript%" echo strDstPath = WScript.Arguments(1) 
13.
> >>"%VBScript%" echo. 
14.
> >>"%VBScript%" echo dblSrcSize = objFSO.GetFolder(strSrcPath).Size 
15.
> >>"%VBScript%" echo dblDstSize = objFSO.GetDrive(objFSO.GetDriveName(strDstPath)).FreeSpace 
16.
> >>"%VBScript%" echo. 
17.
> >>"%VBScript%" echo If dblDstSize ^> dblSrcSize Then 
18.
> >>"%VBScript%" echo   WScript.Quit 0 
19.
> >>"%VBScript%" echo Else 
20.
> >>"%VBScript%" echo   WScript.Quit 1 
21.
> >>"%VBScript%" echo End If 
22.
>  
23.
>  
24.
> if not exist "%DstPath%" goto :Terminate 
25.
> cscript /nologo "%VBScript%" "%SrcPath%" "%DstPath%" || goto :Terminate 
26.
> for %%i in ("%SrcPath%\*.*") do move "%%i" "%DstPath%" 
27.
>  
28.
>  
29.
> :Terminate 
30.
> del "%VBScript%" 
31.
> 
Die Zeilen 3 und 4 musst Du anpassen.

Hallo Friemler,

habe deinen vorgeschlagenen Code angepasst und getestet, funktioniert genau so, wie ich es mir vorgestellt hatte.

Werde nun das Script auf meine Anwendung ansetzen, daher schließe ich diesen Thread noch nicht, vielleicht tritt noch ein Problem auf.

Besten Dank und Grüße aus dem Süden Deutschlands
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (14)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...