- ベストアンサー
バッチファイルのfor文を使ってファイルサイズをMbyteで表したい
- バッチファイルのfor文を使用して、フォルダー内のファイルサイズをMbyteで表したい方法について知りたいです。
- 既存のコマンドではファイルサイズがわかりにくいため、メガバイト単位に変換して一覧で表示したいです。
- 現在試している方法ではうまくいかないため、正しい書き方や解決方法についてアドバイスが欲しいです。
- みんなの回答 (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
その他の回答 (2)
- kirinoma
- ベストアンサー率53% (288/542)
2つほど問題がありそうなので,バッチファイルを2つに分けました. 問題1:(私が)for内で環境変数の値を参照する記法がわからない 通常は%x%ですが,for内だと出力されませんでした. 問題2:setの遅延展開が関係しそう? http://fdays.blogspot.com/2007/12/blog-post_06.html 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バイト以上のファイルをディレクトリに入れて試してみてください. 以上,参考になれば幸いです.
お礼
ありがとうございます。 Callで呼び出すやり方でやってみます。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
バッチコマンドだけでは「四則演算などの数値計算」は出来ません。 if文の大小比較は「文字列を数値とみなして大小比較する」ので、評価対象は文字列です。 ご希望の表示を得るには「パラメータに計算式を書いたら計算してくれるプログラム」が必要です。
お礼
できないのですね。残念。 Vectorで「BatCalc32 コマンドラインに記述された演算式を計算」を見つけたので、これと組み合わせてできないかやってみます。 ありがとうございました。
お礼
目から鱗ですっ! 全くの初心者なもので Callの使い方のとても良い勉強になりました。 もう一つ 数値と考えて、割り算することばかりを考えていました。 自分にとってはコロンブスの卵です。 そうか、右から3(or6)文字切り捨てればオッケーでしたね。応用に,を3桁ずつ入れるとか、いろいろやってみます。 ありがとうございました。