Ottieni le dimensioni del file in KB / MB / GB nel file batch di Windows


0

Ho un file batch di Windows (Windows 7/2008 R2) che richiede un backup giornaliero del file. (Oracle dump export file e.g dump-2016-10-17.DMP)

Voglio aggiungere la dimensione FILE (in una variabile) che dovrebbe essere in KB / MB / GB in base alla dimensione, o almeno dovrebbe ottenere la dimensione del file in MB. CODICE:

@echo off
SET DONE=0
SET Bytes=%~z1
SET KB=%Bytes:~0,-3%
SET MB=%Bytes:~0,-6%
SET GB=%Bytes:~0,-9%
SET TB=%Bytes:~0,-12%
rem echo %~f1

IF "%KB%" EQU "" SET DONE=B
IF %DONE% EQU B echo Size is... %Bytes% Bytes
IF %DONE% EQU B GOTO END

IF "%MB%" EQU "" SET DONE=K
IF %DONE% EQU K SET /a KB=(%BYTES%/1024)+1
IF %DONE% EQU K echo Size is... %KB% KB
IF %DONE% EQU K GOTO END

IF "%GB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=(%BYTES%/1048576)+1
IF %DONE% EQU M echo Size is... %MB% MB
IF %DONE% EQU M GOTO END

IF "%TB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=%KB%/1049
IF %DONE% EQU M echo Size is... %MB% MB (approx)
IF %DONE% EQU M GOTO END

SET DONE=G
IF %DONE% EQU G SET /a GB=%MB%/1074
IF %DONE% EQU G echo Size is... %GB% GB (approx)
IF %DONE% EQU G GOTO END
:END

Hai considerato di utilizzare uno script PowerShell invece di un batch? Altrimenti ciò potrebbe aiutare: stackoverflow.com/questions/1199645/...
Seth

Ok ho preso questo da internet. ma questo mi richiede di inserire il nome del file. come posso aggiungere il nome del file all'interno di questo codice per evitare l'aggiunta di argomenti al momento dell'esecuzione. @echo off SET DONE=0 SET Bytes=%~z1 SET KB=%Bytes:~0,-3% SET MB=%Bytes:~0,-6% SET GB=%Bytes:~0,-9% SET TB=%Bytes:~0,-12% echo %~f1 IF "%GB%" EQU "" SET DONE=M IF %DONE% EQU M SET /a MB=(%BYTES%/1048576)+1 IF %DONE% EQU M echo Size is... %MB% MB IF %DONE% EQU M GOTO END :END
Syed Jahanzaib

Modifica la tua domanda iniziale con quel codice. Questa cosa confusa è inutilizzabile in quella forma. Per avere un'idea di come integrare il nome del file dovresti pubblicare il tuo codice reale e non solo un frammento che hai trovato che fa qualcos'altro. Il miglior approccio sarebbe quello di avere due blocchi di codice, uno con il tuo codice e uno con il codice che hai trovato e che vorrebbe integrare. Questo è probabilmente ancora più semplice in PowerShell.
Seth

Grazie per il suggerimento. Ho modificato la domanda originale per aggiungere il codice. Voglio solo aggiungere il nome del file statico in questo codice. come FNAME = d: \ setup.exe in modo che lo script elabori FNAME,
Syed Jahanzaib

Risposte:


1

Proprio come alternativa, puoi usare l'output di robocopy comando per recuperare le informazioni richieste

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "file=d:\somewhere\file.ext"

    for %%z in ("%file%") do for /f "tokens=1,2" %%a in ('
        robocopy "%%~dpz." "%%~dpz." "%%~nxz" /l /nocopy /is /njh /njs /ndl /nc
    ') do if "%%~dz"=="%%~db" (
        echo "%%~z" : [%%a]
    ) else (
        echo "%%~z" : [%%a%%b] 
    )

robocopy sarà usato per elencare solo ( /l ) le informazioni del file da copiare, rimuovendo qualsiasi informazione non necessaria dall'output (il resto degli switch) e usando a for /f comando per tokenizzare le linee di uscita e leggere solo la dimensione del file

Nel caso di cartelle, è possibile utilizzare la stessa idea, ma invece di leggere i dati dall'elenco dei file, possiamo usare un ricorsivo "copia" e recuperare i dati dal riepilogo del lavoro

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=%~f1" & if not defined folder set "folder=%cd%"

    set "size=" & for %%z in ("%folder%") do for /f "skip=2 tokens=2,3 delims=: " %%a in ('
        robocopy "%%~fz\." "%%~fz\." /l /nocopy /s /is /njh /nfl /ndl /r:0 /w:0 /xjd /xjf /np
        ^| find ":"
    ') do if not defined size (
        (for /f "delims=0123456789." %%c in ("%%b") do (break)) && (
            set "size=%%a%%b"
        ) || (
            set "size=%%a"
        )
    )

    echo "%folder%" : [%size%]

Commuta le modifiche per recuperare solo il riepilogo del lavoro e filtra per leggere solo la riga contenente il Bytes informazione.

modificato 2016/10/26 - cambiato gli switch robocopy per affrontare i problemi di autorizzazione, cambiati Byte: recupero a : filtro di linea più clausola di salto nel caso in cui ci sia un locale senza il Bytes: stringa, rilevamento unità di memoria modificato.


Come posso usare lo stesso comando batch per ottenere le dimensioni della cartella?
Syed Jahanzaib

@SyedJahanzaib, cosa intendi con "dimensione della cartella" ? File all'interno della cartella? , i file sotto la cartella e qualsiasi sottocartella?, ...?
MC ND

esempio voglio ottenere la dimensione completa della cartella D: \ temp. Potrebbero esserci sottodirectory come D: \ temp \ 1 d: \ temp \ 2 Quindi voglio la dimensione completa della cartella D: \ temp.
Syed Jahanzaib

il risultato dovrebbe essere una singola voce come D: \ temp = size = 900M o 5GB
Syed Jahanzaib

@SyedJahanzaib, risposta aggiornata.
MC ND

0

Una soluzione sarebbe quella di chiamare il batch dall'interno dell'altro batch e fare in modo che il file di backup sia l'argomento. Otterresti la dimensione come testo e potresti salvarla in una variabile.

Per farlo "in linea" potresti usarlo in un ciclo come questo:

for %f in (%backupfile%) do set BYTES=%~zf

Dal punto di vista della leggibilità, la prima soluzione sarebbe migliore.


-1

Grazie per il supporto e le linee guida.

Sono finalmente riuscito a risolverlo scaricando il ls per Windows e utilizzo ls -lh filename Sto ottenendo anche le informazioni richieste insieme ad altre informazioni.

Esempio:

D:\zaib>D:\tools\ls.exe -lh setup.exe

-rwxr-x--a  1 Administrators   590M Oct  6  2015 setup.exe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.