dポイントプレゼントキャンペーン実施中!

バッチファイルのfor文を使ってファイルサイズをMbyteで表したい。(WindowsXP)

for文を使って、フォルダー内のファイル名とサイズ一覧を作ろうとしています。

1)for %%i in (c:\test\*.*) do echo %%i %%~zi>> c:\test\testfiles.txt

で一応はできたのですが、これではファイルサイズがわかりにくいので、メガバイト単位にしたいのです。(だいたいわかればいいので1024で割るとかはしない)

2)for %%i in (c:\test\*.*) do echo %%i %%~zi/1000000>> c:\test\testfiles.txt
3)for %%i in (c:\test\*.*) do set /a x=%%~zi/1000000 & echo %%i %%x>> c:\test\testfiles.txt
としてもうまくいきません。

%%~ziが数値でなく文字列のため、だと思うのですが、3)は%の付け方とかも間違ってそう。
どう書けばメガバイト単位で一覧を出せるでしょうか?

あれ?
4)for %%i in (c:\test\* ) do if %%~zi GEQ 1000000 echo %%i>> c:\test\testfiles.txt
とすれば1メガ以上のファイル名一覧が出ますね。 ということは%%~ziは数値なのか。

 どなたか、どこが間違っているのか教えていただけないでしょうか

A 回答 (3件)

for文では処理が難しいなら、関数呼び出しに切り替えれば良いのです。


次の例(sample.bat)では、ShowFileSize関数に、第一引数がファイル名、第二引数がファイルサイズを与えます。この関数内であれば、好きなだけ加工ができます。
この例では、バイトサイズ(BSIZE) -> KB -> MBと二段階に加工しています。
ただし、四則演算では、巨大数値(GB)になるとマイナスになります。
そこで、環境変数の最後の3文字を切り捨てることで、回避しています。(KSIZEの計算例)
ファイル・サイズに制限があれば、1024や1000等で割ることも可能です。(MSIZEの計算例)

後は、echo行で、c:\test\testfiles.txtにリダイレクトさせれば、問題解決です。

------ sample.bat -------------------------
@echo off
set ARG1=%1
for %%i in (%ARG1%) do call :ShowFileSize %%i %%~zi
goto :EOF

:ShowFileSize
set NAME=%1
set BSIZE=%2
set /A KSIZE=%BSIZE:~,-3%
set /A MSIZE=%KSIZE%/1000

echo %NAME% %BSIZE%B, %KSIZE%KB, %MSIZE%MB

exit /b
---------- 実行例 ---------------
C:\>sample Y:\vmware\*.zip
win2k3sp2.zip 4101185818B, 4101185KB, 4101MB
    • good
    • 4
この回答へのお礼

目から鱗ですっ!
全くの初心者なもので
Callの使い方のとても良い勉強になりました。

もう一つ
数値と考えて、割り算することばかりを考えていました。 自分にとってはコロンブスの卵です。
そうか、右から3(or6)文字切り捨てればオッケーでしたね。応用に,を3桁ずつ入れるとか、いろいろやってみます。

ありがとうございました。

お礼日時:2010/06/27 14:05

2つほど問題がありそうなので,バッチファイルを2つに分けました.



問題1:(私が)for内で環境変数の値を参照する記法がわからない
    通常は%x%ですが,for内だと出力されませんでした.

問題2:setの遅延展開が関係しそう?
    http://fdays.blogspot.com/2007/12/blog-post_06.h …


checksize.bat:

for %%i in (c:\test\*.*) do set /a x=%%~zi/1000000 & CALL checksizeSub.bat %%i

checksizeSub.bat:

echo %1 %x% >> c:\test\testfiles.txt


なお,小数点以下は扱ってくれないので,1000000バイト以下のファイルですと何でも0になってしまいます.
1000000バイト以上のファイルをディレクトリに入れて試してみてください.

以上,参考になれば幸いです.
    • good
    • 0
この回答へのお礼

ありがとうございます。
Callで呼び出すやり方でやってみます。

お礼日時:2010/06/27 14:08

バッチコマンドだけでは「四則演算などの数値計算」は出来ません。



if文の大小比較は「文字列を数値とみなして大小比較する」ので、評価対象は文字列です。

ご希望の表示を得るには「パラメータに計算式を書いたら計算してくれるプログラム」が必要です。
    • good
    • 0
この回答へのお礼

できないのですね。残念。
Vectorで「BatCalc32 コマンドラインに記述された演算式を計算」を見つけたので、これと組み合わせてできないかやってみます。
ありがとうございました。

お礼日時:2010/06/27 14:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています