2015-06-17 21 views
6

C'è un modo per ottenere la dimensione su disco di un file come nella finestra delle proprietà:Esiste un modo per stampare in batch le dimensioni del file su disco?

ho provato:

(all'interno di un file batch)

echo %~z1 

,

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

,

dir 

Ma restituiscono solo la dimensione del file (s).

C'è un modo per ottenere la "dimensione su disco" come quella vista nella finestra delle proprietà?

risposta

5

Interessante domanda. Non sono a conoscenza della dimensione sul valore del disco che è una proprietà di qualsiasi oggetto con script. È possibile calcolarlo recuperando il file modulo byte per cluster, sottraendo tale modulo dalla dimensione del file, quindi aggiungendo la dimensione del cluster. (Edit: o utilizzare il calcolo più efficiente del Aacini, che sto ancora cercando di capire.)

@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% 

Molti siti web sostengono che fsutil fsinfo ntfsinfo DRIVE: è il modo migliore per ottenere i byte per cluster. Sembra che questo metodo sia pieno di pericoli, con etichette diverse a seconda delle impostazioni locali e un numero diverso di righe per diverse versioni di Windows. Inoltre, come dice Marged, fsutil richiede l'elevazione. Questo metodo WMI sembra funzionare in modo più universale e senza richiedere diritti di amministratore.

Grazie JosefZ, Marged e Aacini per tutto il vostro contributo!

+2

Utilizzare "byte per cluster" (ad esempio 4096) anziché "byte per settore fisico" (ad esempio 512). (Verificato sul mio _tiny_ SSD). Quindi 'set/a ondisk = (fs/clus +1) * clus)' – JosefZ

+0

Grazie Josef! Non ero sicuro di quale valore utilizzare, poiché sono entrambi uguali sul sistema in cui mi trovo ora. – rojo

+0

'findstr/i/C:" byte per cluster "' nota l'importanza dell'interruttore '/ C:'. Modifica il mio commento precedente: Quindi 'set/a ondisk = (fs/clus +1) * clus' senza il punto') '. – JosefZ

2

Questo non è destinato ad essere una risposta, solo i valori @rojo chiesto:

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 

Questo è da un Windows tedesca 8.1. Penso che se è necessario rendere indipendente la localizzazione del batch non si può adottare l'approccio di grepping. Invece lo scripting dell'oggetto filesystem appropriato usando l'host di script sarà una soluzione.

Il comando WMIC ha questo risultato ...

SOMENAME,4096,C:\ 

... in più il vantaggio che non ho bisogno di eseguire questo comando con diritti amministrativi.

+0

Grazie Marged. Finché sei disposto a diventare il mio scagnozzo, puoi eseguire il 'percorso wmic win32_volume ottenere il nome, blocca/formato: csv | findstr/i "c:" 'e dimmi se il valore restituito include 4096? – rojo

+0

@rojo ha aggiornato la mia risposta e, come previsto, funziona anche per Windows tedesco. Forse è in qualche modo possibile aggiungere un 'where name = C:' o simile alla query wmic. Sebbene il tuo script sia fantastico, penso che questo sia un caso limite in cui si potrebbe pensare di passare da un batch all'altro a uno scripting migliorato. – Marged

+0

JosefZ ha suggerito la stessa cosa. Ho aggiunto la modifica suggerita e ho appena scartato l'intero metodo 'fsutil'. – rojo