どのように私は、Windowsのバッチスクリプト内のファイルのサイズを確認することができますか?

StackOverflow https://stackoverflow.com/questions/1199645

  •  20-09-2019
  •  | 
  •  

質問

私はfilesizeがファイルの何であるかチェックするバッチファイルを持っていると思います。

それはどこか別の場所にGOTOにリダイレクトする必要%somany% kbytes,よりも大きい場合。

例:

[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
役に立ちましたか?

解決

ファイル名は、バッチファイルへのパラメータとして使用されている場合は、あなたが必要とするすべての%~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
)

他のヒント

私は@Anders答えが好きなので%〜Z1秘密のソースの説明。 ただし、ファイル名は次のように渡されたときにのみ動作することを、指摘したように バッチファイルの最初のパラメータます。

@Andersはに素晴らしい1-ライナーの修正である、FORを使用することで、この周りに働きました 問題は、しかし、それは読むためにやや難しくなります。

その代わり、我々は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

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

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

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF
あなたの%file%は、入力パラメータである場合は、

、あなたは%~zNはパラメータの数であるNを、使用することができます。

例えば。

を含むtest.bat
@echo %~z1

あなたはそれが、対応するファイルのサイズを表示します「test myFile.txt」を使用するので、もし、最初のパラメータのサイズを表示します。

あなたが使用するためにいつものように、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ループを使用します。

別の例

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

タグを含む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.

あなたも、エコー声明の中で、二重パーセントに注意し、厄介な、必要なファイルを排除するためにその場でテストファイルを作成することができます:

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

この後者の溶液をantispaghettiあります。とても素敵。しかし、より多くのディスクは書いています。使用回数をチェックします。

ちょうどWindowsは内蔵の何かを持っていたかどうかを調べて、この古い質問を見ました。〜Zの事は、私は知りませんでした何かが、私には適用されません。私は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

これは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  
    )
)  

未きれいな解決策は、それは仕事を取得します。

「無効な番号:注意することが重要

バッチの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値よりも大きい任意の数のSCRIPTが解除されます!ファイルサイズはバイト単位で測定されるよう見て、スクリプトを約255.9999997615814メガバイトの最大ファイルサイズをサポートします!

いくつかの「試してみて、テスト」反復の後、私は、サイクル変数(ないコマンドラインパラメータ)で、ファイルのサイズを取得する方法を(まだここには存在しない)ことがわかりました

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

ジャストアイデアます:

あなたは「DIR」コマンドを実行して、ファイルサイズを得ることができます

>dir thing

その後、再び、それは非常に多くのものを返します。

あなたがそれを見れば、

たぶん、あなたはそこからそれを得ることができます。

しかし、私はわからない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top