Windows バッチ ファイルでファイル サイズを KB/MB/GB 単位で取得する

Windows バッチ ファイルでファイル サイズを KB/MB/GB 単位で取得する

ファイルの毎日のバックアップを取る Windows (Windows 7/2008 R2) バッチ ファイルがあります。(Oracle ダンプ エクスポート ファイル、例: dump-2016-10-17.DMP)

ファイル サイズを (変数に) 追加します。サイズに応じて KB/MB/GB 単位になるか、少なくともファイル サイズは MB 単位で取得される必要があります。コード:

@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

答え1

代わりに、robocopyコマンドの出力を使用して必要な情報を取得することもできます。

@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/lコピーされるファイルの情報のみをリスト()するために使用され、出力(残りのスイッチ)から不要な情報を削除し、for /f出力行をトークン化してファイルサイズのみを読み取るコマンドを使用します。

フォルダの場合も同じ考え方が使えますが、ファイルリストからデータを読み取る代わりに、再帰的に"コピー"ジョブサマリーからデータを取得する

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

スイッチはジョブの概要のみを取得するように変更され、情報を含む行のみを読み取るようにフィルタリングされましたBytes

編集済み2016/10/26 - 権限の問題に対処するために robocopy スイッチを変更し、文字列のないロケールがある場合に備えて、Byte:取得を行フィルターと skip 句に変更し、ストレージ ユニットの検出を変更しました。:Bytes:

答え2

1 つの解決策は、他のバッチ内からバッチを呼び出し、バックアップ ファイルを引数にすることです。サイズをテキストとして取得し、それを変数に保存できます。

これを「インライン」で実行するには、次のようにループ内で使用できます。

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

読みやすさの観点からは、最初の解決策の方が適しています。

答え3

サポートとガイドラインに感謝します。

ls最終的に、 Windows 用のをダウンロードして使用することで問題を解決できました。ls -lh filename必要な情報とその他の情報も取得しています。

例:

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

-rwxr-x--a  1 Administrators   590M Oct  6  2015 setup.exe

答え4

必要なものは2つあります。

filesize.bat 

@echo off
echo %~z1

そして、ここで報告された価値を実際に評価しようとしているのは

この例では、%z%を評価して、ファイルがゼロより大きい場合にのみファイルをコピーし、ゼロ以外のファイルのみをコピーします。

for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )

%z% を取得すると、切り捨て計算などを実行できますが、サイズ自体を取得するのは少し面倒です。

関連情報