2009-07-29 14 views
51

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

%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 

答えて

83

C:\> call /? 

C:\> if /? 

簡単な例を参照してください。 )

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

@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 
) 
+5

上では動作しません。あなたは説明できます"usebackq"オプションはどのように役立ちますか?それはファイルサイズとは関係がないようですが、削除すると機能しなくなります – JoelFan

+8

@JoelFan:usebackqを使用しないと、 'quoteはコマンドでありstringではありません(詳細はFOR /?を実行してください) FOR/F "tokens = *" %% A IN( "%file%")DO ... – Anders

+0

こんにちは@アンダーズあなたは私に同じことをする方法を教えてくれますか?私は複数のファイルを連続して持っています。私のファイルが2kb以下であれば設定したいのですが、それをdiffフォルダに移動しますか?私の結果は、パス内の各ファイルをテストし、検証する必要があります。 –

-4

ジャストアイデア:

あなたは "DIR" のコマンドを実行して、ファイルサイズを取得することがあります。

>dir thing 

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

もしあなたがそれを探すなら、そこから得ることができるかもしれません。

でもわかりません。

4

使用するためにいつものように、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ループを使用します(中バッチ)を使用して戻り値を取得します。

8

%file%が入力パラメータの場合は、%~zNを使用できます。ここで、Nはパラメータの番号です。

など。あなたは「test myFile.txt」を使用している場合、それは、対応するファイルのサイズが表示されますので、

@echo %~z1 

を含むtest.batは、最初のパラメータのサイズを表示します。

10

%~z1は、バッチファイルの最初の引数のサイズに展開されます。ファイル名はあなたが必要とするすべては%~z1で、バッチファイルへのパラメータとして使用されている場合は1が最初のパラメータを意味し(

@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 
+0

シナンÜnürあなたのソリューションは、Windows Server 2008の.. –

1

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 
1

これはVB/perlのは/ etcを使用せずにファイルサイズを評価するための私の解決策でした。

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 
    ) 
) 

しかし、最もクリーンな解決策ではありませんが、それは仕事を完了します。

4

別の例

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

私はDOSの機能を使用することを好みます。私には清潔感がある。

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

GOTO :EOF 

:FileSize 
SET %~2=%~z1 

GOTO :EOF 
+0

DOSには関数と ':eof'はありません。それらはWindowsのcmd.exeの機能です。 [それらは完全に異なる](https://superuser.com/q/451432/241386) –

2

あなたも厄介な、必要なファイルを排除するためにその場でテストファイルを作成することができます

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. 

それを呼び出して

GetFileSize=%~z1 

を含むGetFileSize.bat 1行のバッチファイルを作成します。 echoステートメントの倍数パーセントに注意してください。

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

この後者の解決策は、スパイスヘルメットです。とても素敵です。しかし、より多くのディスク書き込み。使用回数を確認してください。

-1

重要な点は、バッチのINT32制限が「無効な番号」です。数値は32ビットの精度に制限されています。

は、次のステートメントを試してみてください:SCRIPTを中断します最大INT32値より

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!) 

任意の数の大きいです!ファイルサイズがバイト単位で測定されていることを確認すると、スクリプトは最大ファイルサイズを約255.9999997615814 MBにサポートします。

+0

これは間違っています。私は5GBのファイルを作成し、%〜z1を使用してそのファイルサイズを読み取ることができ、5056590344と報告しました。 –

+1

これは数字に変換されずにまだ文字列であるためです。比較や算術演算をSet/Aで試してください.2GBを超えるものは失敗します。 – Bilbo

9

%〜z1シークレットソースの説明のため、@アンダーが答えます。 しかし、指摘したように、ファイル名が の最初のパラメータとしてバッチファイルに渡された場合にのみ動作します。

@アンダーは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 %maxbytesize% bytes 
) 
goto :eof 

:setsize 
set size=%~z1 
goto :eof 
0

サイクル変数(ないコマンドラインパラメータ)で、ファイルのサイズを取得する方法(まだここには存在しない)が見つかりまし:

for %%i in (*.txt) do (
    echo %%~z%i 
) 
関連する問題