2015-06-17 4 views
6

Gibt es eine Möglichkeit, die Größe auf dem Datenträger einer Datei wie im Eigenschaften-Fenster zu erhalten:Gibt es eine Möglichkeit, die Dateigröße im Stapel auf der Festplatte auszugeben?

(innerhalb einer Batch-Datei)

echo %~z1 

:

ich versucht habe, ,

for %i in (TestFile.txt) do echo %~zi 

,

dir 

Aber sie geben nur die Größe der Datei (en) zurück.

Gibt es eine Möglichkeit, die „Größe auf dem Datenträger“ wie die im Fenster Eigenschaften zu sehen zu bekommen?

Antwort

5

Interessante Frage. Mir ist nicht bekannt, dass die Größe auf dem Datenträgerwert eine Eigenschaft eines skriptfähigen Objekts ist. Sie können dies berechnen, indem Sie die Modulo-Byte-Größe pro Cluster ermitteln, diesen Modulo von der Dateigröße subtrahieren und dann die Cluster-Größe hinzufügen. (Edit: oder Aacini des effizientere Berechnung verwenden, die ich immer noch versuchen zu verstehen.)

@echo off 
setlocal 

for %%I in (Testfile.txt) do (
    set "fs=%%~zI" 
    for /f %%J in (
     'wmic volume where "driveletter='%%~dI'" get blocksize /value' 
    ) do 2>nul set /a %%J 
) 

echo Size: %fs% 

set /a ondisk = ((fs-1)/blocksize+1) * blocksize 

echo Size on disk: %ondisk% 

Viele Websites behaupten, dass fsutil fsinfo ntfsinfo DRIVE: ist der beste Weg, um das Bytes pro Cluster zu erhalten. Es scheint, dass diese Methode mit Gefahren behaftet ist, mit verschiedenen Beschriftungen je nach Gebietsschema und unterschiedlicher Anzahl von Zeilen für verschiedene Windows-Versionen. Darüber hinaus erfordert, wie Marged sagt, fsutil Elevation. Diese WMI-Methode scheint universeller zu funktionieren und erfordert keine Administratorrechte.

Dank JosefZ, Marged und Aacini für alle Ihre Eingabe!

+2

Verwenden 'Bytes pro Cluster' (zum Beispiel 4096) statt' Bytes pro physischem Sector' (zum Beispiel 512). (Verifiziert auf meiner _tiny_ SSD). Dann 'set/a = platteninterne (fs/clus +1) * clus)' – JosefZ

+0

Dank Josef! Ich war mir nicht sicher, welchen Wert ich verwenden sollte, da beide auf dem System, auf dem ich gerade arbeite, identisch sind. – rojo

+0

'findstr/i/C: "Bytes pro Cluster"' beachten Sie die '/ C:' Schalter Bedeutung. Bearbeite meinen vorherigen Kommentar: Dann setze/a ondisk = (fs/clus +1) * clus' ohne nachzufolgen ')'. – JosefZ

2

Dies ist keine Antwort auf sein, nur die Werte bestimmt @rojo gefragt:

NTFS-Volumeseriennummer    0xacf01e6ef01e3ed0 
NTFS-Version :       3.1 
LFS-Version :     2.0 
Anzahl der Sektoren :    0x000000000ed737ff 
Gesamtzahl Cluster :    0x0000000001dae6ff 
Freie Cluster :      0x00000000008c8d41 
Insgesamt reserviert :    0x0000000000000f70 
Bytes pro Sektor :     512 
Bytes pro physischem Sektor :  512 
Bytes pro Cluster :     4096 
Bytes pro Dateidatensatzsegment : 1024 
Cluster pro Dateidatensatzsegment : 0 
Gültige MFT-Datenlänge :   0x000000001c1c0000 
MFT-Start-LCN :     0x00000000000c0000 
MFT2-Start-LCN :     0x0000000000000002 
MFT-Zonenstart :     0x00000000018a8ee0 
MFT-Zonenende :     0x00000000018b12e0 
Ressourcen-Manager-Bezeichner:  A81246B1-33B0-11E4-A94B-AEB4ABF863CB 

Dieses wird von einem deutschen Windows-8.1 ist. Ich denke, wenn es notwendig ist, das Batch-Gebietsschema unabhängig zu machen, können Sie den Grepping-Ansatz nicht verwenden. Stattdessen ist das Scripting des entsprechenden Dateisystemobjekts mithilfe des Skripthosts eine Lösung.

Der WMIC Befehl dieses Ergebnis hat ...

SOMENAME,4096,C:\ 

... plus den Vorteil, dass ich nicht brauchen diesen Befehl mit Administratorrechten ausgeführt werden.

+0

Danke Marged. Solange du bereit bist, mein Handlanger zu sein, kannst du 'wmic path win32_volume get name, blocksize/format: csv | ausführen findstr/i "c:" 'und sagen Sie mir, ob der zurückgegebene Wert 4096 enthält? – rojo

+0

@rojo hat meine Antwort aktualisiert und wie erwartet funktioniert das auch für deutsche Windows. Vielleicht ist es irgendwie möglich, ein 'where name = C:' oder ähnliches zur wmic-Abfrage hinzuzufügen. Obwohl Ihr Skript großartig ist, denke ich, dass dies ein Grenzfall ist, bei dem man daran denken könnte, von Stapeln zu verbesserten Skripten zu wechseln. – Marged

+0

JosefZ schlug das gleiche vor. Ich fügte die vorgeschlagene Änderung hinzu und verwarf gerade die gesamte "fsutil" -Methode. – rojo

Verwandte Themen