web-dev-qa-db-ja.com

Windowsバッチスクリプトでファイルのサイズを確認するにはどうすればよいですか?

ファイルのfilesizeが何であるかをチェックするバッチファイルが必要です。

%somany% kbytes,よりも大きい場合は、GOTOを使用して別の場所にリダイレクトする必要があります。

例:

[check for filesize]
IF %file% [filesize thing Bigger than] GOTO No
echo Great! Your filesize is smaller than %somany% kbytes.
pause
exit
:no
echo Um... You have a big filesize.
pause
exit
58
Deniz Zoeteman

ファイル名がバッチファイルのパラメーターとして使用される場合、必要なのは%~z1(1は最初のパラメーターを意味します)

ファイル名がパラメーターではない場合、次のようなことができます。

@echo off
setlocal
set file="test.cmd"
set maxbytesize=1000

FOR /F "usebackq" %%A IN ('%file%') DO set size=%%~zA

if %size% LSS %maxbytesize% (
    echo.File is ^< %maxbytesize% bytes
) ELSE (
    echo.File is ^>= %maxbytesize% bytes
)
96
Anders

%〜z1の秘密のソースの説明のため、@ Andersの回答が好きです。ただし、指摘したように、これはファイル名が最初のパラメーターとしてバッチファイルに渡された場合にのみ機能します。

@AndersはFORを使用することでこれを回避しました。これは、問題に対する1行の優れた修正ですが、読むのが少し難しいです。

代わりに、CALLを使用して、%〜z1を使用した簡単な答えに戻ることができます。環境変数にファイル名を保存している場合、それをバッチファイルのルーチンのパラメーターとして使用すると、%1になります。

@echo off
setlocal
set file=test.cmd
set maxbytesize=1000

call :setsize %file%

if %size% lss %maxbytesize% (
    echo File is less than %maxbytesize% bytes
) else (
    echo File is greater than or equal %maxbytesize% bytes
)
goto :eof

:setsize
set size=%~z1
goto :eof

32ビットの制限に関するJ. Bouvrieの懸念に興味がありました。彼は、ファイルサイズのロジック自体ではなくLSSの使用に関する問題について話しているようです。 J. Bouvrieの懸念に対処するために、私はソリューションを書き直して、埋め込み文字列比較を使用しました。

@echo on
setlocal
set file=test.cmd
set maxbytesize=1000

call :setsize %file%

set checksize=00000000000000000000%size%
set checkmaxbytesize=00000000000000000000%maxbytesize%
if "%checksize:~-20%" lss "%checkmaxbytesize:~-20%" (
    echo File is less than %maxbytesize% bytes
) else (
    echo File is greater than or equal %maxbytesize% bytes
)
goto :eof

:setsize
set size=%~z1
goto :eof
13
Stephen Quan

%~z1は、バッチファイルの最初の引数のサイズに展開されます。見る

C:\> call /?

そして

C:\> if /?

簡単な例:

@ECHO OFF
SET SIZELIMIT=1000
SET FILESIZE=%~z1

IF %FILESIZE% GTR %SIZELIMIT% Goto No

ECHO Great! Your filesize is smaller than %SIZELIMIT% kbytes.
PAUSE
GOTO :EOF

:No
ECHO Um ... You have a big filesize.
PAUSE
GOTO :EOF
11
Sinan Ünür

DOS機能を使用することを好みます。私にはきれいに感じます。

SET SIZELIMIT=1000
CALL :FileSize %1 FileSize
IF %FileSize% GTR %SIZELIMIT% Echo Large file

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF
9
user3708417

もしあなたの %file%は入力パラメーターです。%~zN、ここでNはパラメーターの番号です。

例えば。 test.bat含む

@echo %~z1

最初のパラメーターのサイズが表示されるため、「test myFile.txt "対応するファイルのサイズが表示されます。

8
HerdplattenToni

もう一つの例

  FOR %I in (file1.txt) do @ECHO %~zI
4
paranoid

通常どおり、VBScriptを使用できます。

Set objFS = CreateObject("Scripting.FileSystemObject")
Set wshArgs = WScript.Arguments
strFile = wshArgs(0)
WScript.Echo objFS.GetFile(strFile).Size & " bytes"

filesize.vbsとして保存し、コマンドラインで入力します。

C:\test>cscript /nologo filesize.vbs file.txt
79 bytes

forループ(バッチ)を使用して、返される結果を取得します。

4
ghostdog74

を含む1行のバッチファイルGetFileSize.batを作成します

GetFileSize=%~z1

それからそれを呼ぶ

call GetFileSize  myfile.txt
if (%GetFileSize) == ()     goto No_File
if (%GetFileSize) == (0)    goto No_Data
if (%GetFileSize) GTR 1000  goto Too_Much_Data
rem Etc.

テストファイルをその場で作成して、厄介な必要なファイルを削除することもできます。エコーステートメントの2パーセントに注意してください。

echo set GetFileSize=%%~z1 > %temp%\GetFileSize.bat
call %temp%\GetFileSize  myfile.txt
if (%GetFileSize) GTR 1000  goto Too_Much_Data
rem etc

後者の解決策はスパゲッティです。いいねただし、より多くのディスク書き込み。使用回数を確認してください。

2
jim birch

この古い質問を見て、Windowsに何かが組み込まれているかどうかを確認しました。私はPerlのワンライナーになりました:

@echo off

set yourfile=output.txt
set maxsize=10000

Perl -e "-s $ENV{yourfile} > $ENV{maxsize} ? exit 1 : exit 0"
rem if %errorlevel%. equ 1. goto abort
if errorlevel 1 goto abort

echo OK!
exit /b 0

:abort
echo Bad!
exit /b 1
1
Bill Ruppert

これは、VB/Perl/etcを使用せずにファイルサイズを評価するための私のソリューションでした。ネイティブWindowsシェルコマンドの使用:

FOR /F "tokens=4 delims= " %%i in ('dir /-C %temp% ^| find /i "filename.txt"') do (  
    IF %%i GTR 1000000 (  
        echo filename.txt filesize is greater than 1000000  
    ) ELSE (  
        echo filename.txt filesize is less than 1000000  
    )
)  

最もクリーンなソリューションではありませんが、仕事は完了です。

1
bennett

「試行錯誤」を数回繰り返した後、サイクル変数(コマンドラインパラメーターではない)でファイルのサイズを取得する方法(ここにはまだありません)を見つけました。

for %%i in (*.txt) do (
    echo %%~z%i
)
0
Smylic

注意すべき重要な点は、バッチのINT32制限です: '無効な番号です。数値は32ビットの精度に制限されています。

次のステートメントを試してください。

IF 2147483647 GTR 2147483646 echo A is greater than B (will be TRUE)
IF 2147483648 GTR 2147483647 echo A is greater than B (will be FALSE!)

INT32の最大値を超える数値は、スクリプトを破ります!ファイルサイズはバイト単位で測定されるため、スクリプトは約255.9999997615814 MBの最大ファイルサイズをサポートします!

0
J. Bouvrie