ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:sti_test HDD容量確認バッチを作りたいです。
困り度:
  • 困っています
管理しているPCのハードディスクの空き容量(PCによって違いますが、C/DかC/D/E)の空き容量を確認して毎日テキストに出力したいです。

実行OSはXP/2003server/2000serverです。

ソフトを追加できないので、なんとかバッチで処理したいのですが、、、
1台のPCでバッチを走らせるとネットワークの指定したPCの容量も確認って事はできないですよね?

調べたところ、「set size=dir C:\ | find "バイトの空き領域"」で空き容量をだせるみたいなのですが、バイト表示をGB表示で出したいのですが可能でしょうか?

詳しい人・・・教えてください><
質問投稿日時:08/07/14 21:57
質問番号:4176889
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:anmochi > yyyymm = Year(today) & Left("0" & Month(today),2)
 大変よくできまし・・・・ん? これだと11月が「"0" & "11"→"011"の左側2文字を取る→"01"」になるのでRightを使おう。
yyyymm = Year(today) & Right("0" & Month(today), 2)
yyyymmdd = yyyymm & Right("0" & Day(today), 2)
よく頑張りました。

> 空き容量取得の時に少数点以下2桁(3桁目は四捨五入しない)で表示+
> 空き容量がMBの時はGB表示ではなくMB表示で表示すると言うことは可能でしょうか。
> (各サーバを見ましたら空き容量がMBのもありまして^^;)

 MB表示の方は1024で割って1024で割って・・・・という所を、割っては確認、割っては確認とするように変更しましょう。Ifを使えば良いね。とりあえず最も分かりやすく最も泥臭い処理で書いてみるので、より効率の良い手段はないか是非考えてみてくれたまい。抜粋です。

Dim fspace, surfix
fspace = drv.FreeSpace
surfix = "B"
If fspace > 1024 Then ' 空きが1024バイト以上
fspace = fspace / 1024
surfix = "KiB"
End If
If fspace > 1024 Then ' 空きが1024×1024バイト以上
fspace = fspace / 1024
surfix = "MiB"
End If
If fspace > 1024 Then ' 空きが1024×1024×1024バイト以上
fspace = fspace / 1024
sufix = "GiB"
End If
fspace = Fix(fspace * 100) / 100 ' 小数点第二位を取るため100倍して切り捨てて100で割る

 これで出てきたfspace & surfixが"60.58GiB"などのようになる。四捨五入じゃないという事なので切り捨てを行っております。ところでこれだと小数点第二位が0の時、"60.5GiB"と小数点以下が一桁表示になってしまうので、"60.50GiB"と表示したければもう一工夫必要だ。
 また、これを空きと総容量の両方で個別に行うと「985.5MiBの空き/19.98GiB中」などと単位がずれる。個人的な意見ではあるがこの2つは単位をそろえる方が空き容量の割合が見やすいと私は思う。それか、パーセント表示(5.25%Free)を横につけるとかね(割り算でできるよね)。これも工夫していただきたい。機能を付け足していけるのもスクリプトの醍醐味だし、より良い方法はないか、不便はないかもっと便利にならないかと考える訓練はいつかきっと助けになる事でしょう。

 ちなみに今回単位がKiB、MiB、GiBとなっているが、これは二進接頭辞と言って一応ちゃんとした国際規格で、厳密に1KiB=1024B、1MiB=1024KiBと認識されるものだ。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/16 23:00
回答番号:No.3
この回答への補足anmochiさん

>大変よくできまし・・・・ん? これだと11月が「"0" & "11"→"011"の左側2文字を取る→"01"」になるのでRightを使おう。

あぅ・・・今の事(今月が正しく表示できた)だけしか思いつきませんでした^^;

教えて頂いたのを参考に作ったら今のところ希望した動作になりました^^
エラー処理の追加して実用できるものにしたいと思います。
長々とありがとうございました^^

またわからない事が出れば(がんばります^^;)書き込みしますので、お時間があれば教えてください^^
この回答へのお礼長々と教えてくださりありがとうございました^^

回答

 

回答者:anmochi > 欲を言えば・・・C\:drvlog\YYYYDD\PC名_YYYYMMDD.txtではかせたいです^^;
むぅ・・・・。YYYYDDはYYYYMMの間違いと仮定する。

−−−−ここから
' 変数定義
Dim fso, net, drv, ts, s, fname, yyyymmdd, yyyymm, today

' 初期処理
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set net = WScript.CreateObject("WScript.Network")

' 日付を取得
today = Now()
yyyymm = Year(today) & Month(today)
yyyymmdd = yyyymm & Day(today)

' フォルダの存在を確認し無ければ自動で作る
fname = "C:\drvlog"
If Not fso.FolderExists(fname) Then
fso.CreateFolder(fname)
End If
fname = fname & "\" & yyyymm
If Not fso.FolderExists(fname) Then
fso.CreateFolder(fname)
End If

' ログファイルを作る
fname = fname & "\" & net.ComputerName & "_" & yyyymmdd & ".txt"
Set ts = fso.CreateTextFile(fname)

' レディなドライブの容量をテキストに書く
For Each drv In fso.Drives
If drv.IsReady Then
s = drv.DriveLetter & " - "
s = s & drv.VolumeName
s = s & Fix(drv.FreeSpace / 1024 / 1024 / 1024) & "GBの空き"
s = s & " / " & Fix(drv.TotalSize / 1024 / 1024 / 1024) & "GB中"
Call ts.WriteLine(s)
End If
Next
ts.Close
−−−−ここまで

 例によって検証はお願いする。これで、フォルダが無ければ自動で作成してログファイルもはくようになった。月が変わっても大丈夫だ。
 が! くっくっく。実行してみると分かるが、月や日が1桁の時に、例えば7月を07としてくれない。2008年7月15日が2008715となってしまうのだ。この部分は宿題として残しておこう。それがなぜで、ではどうすれば良いのか。是非ともチャレンジしていただきたい。また、これは思いつくままに書いただけなので決して良いスクリプトとは言えない。エラー処理も一切無い。是非改良して手になじむツールにして欲しい。
 決して意地悪で言っているのではなく、アドミン族に必要なのはこの辺をちゃちゃっとなんとかして管理を楽にする能力なのだ。

 「日付を取得」のエリアを・・・・ごにょごにょ。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/15 22:56
回答番号:No.2
この回答への補足anmochiさん

>むぅ・・・・。YYYYDDはYYYYMMの間違いと仮定する。
間違えてました^^;

>この部分は宿題として残しておこう。
yyyymm = Year(today) & Left("0" & Month(today),2)
で希望の動作になりました。

すみません。また質問です^^;
空き容量取得の時に少数点以下2桁(3桁目は四捨五入しない)で表示+
空き容量がMBの時はGB表示ではなくMB表示で表示すると言うことは可能でしょうか。
(各サーバを見ましたら空き容量がMBのもありまして^^;)

もしお時間があれば教えてください^^;
頑張って中身の理解を今してます^^;
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:anmochi その3つのOS限定で良いなら、WSHを使うと良いでしょう。

−−−−ここから
Dim fso, drv, ts, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.CreateTextFile("C:\drvlog.log")
For Each drv In fso.Drives
If drv.IsReady Then
s = drv.DriveLetter & " - "
s = s & drv.VolumeName
s = s & Fix(drv.FreeSpace / 1024 / 1024 / 1024) & "GBの空き"
s = s & " / " & Fix(drv.TotalSize / 1024 / 1024 / 1024) & "GB中"
Call ts.WriteLine(s)
End If
Next
ts.Close
−−−−ここまで

以上のコードをテキストエディタにコピペして、c:\chkfree.vbsなど、拡張子をvbsにして保存。後はコマンドプロンプトで

C:\>cscript.exe chkfree.vbs

でテキストファイルができあがる。コードの意味はゆっくり読み解けば良いでしょう。WindowsPowerShellも良いけど、Windows Scripting Hostだとその3つのOSにはほぼ入っているのでこっちの方が楽じゃないかな。今ささっと書いてみただけなので動かないかも・・・・。検証してくだされ。

> 1台のPCでバッチを走らせるとネットワークの指定したPCの容量も確認って事はできないですよね?
RPCやTelnetなんかを駆使すればできるかも知れないけど・・・・。何のソフトも無しではすぐには思いつかないな。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/14 23:12
回答番号:No.1
この回答への補足anmochiさん

ありがとうございます。
自宅のXP Proにて「C:\>cscript.exe chkfree.vbs」実行しましたらうまく動きました^^
明日serverでも確認をしてみます。

VBSはまったく知らないので教えて君で申し訳ないですが、ファイル名をPC名_YYYYMMDD.txtで吐き出せますでしょうか。
欲を言えば・・・C\:drvlog\YYYYDD\PC名_YYYYMMDD.txtではかせたいです^^;

もし知ってましたら参考URLでもかまいませんのでお教えくださいませ><
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示