見出し画像

【VBS】社内の共有資源(共有フォルダ)の空き容量を監視するツール

社内の共有資源(共有されたネットワークドライブ内の特定フォルダ)の空き容量を監視し続け、空き容量が確保されたタイミングで「空き容量ができたよ!」とお知らせしてくれるツールです。
常に共有資源(共有フォルダ)容量がパンパンな職場環境だと重宝します。
 ※ここでの共有資源とは、ファイルサーバーを指します。
  クラウドストレージとしての共有資源の話ではありません。

【私の職場環境】
私の職場では、ローカルディスク(C:)のほかに、社内共有資源のネットワークドライブ(F:)が割り当てられています。 
この(F:)は、所属する部署毎にアクセスできる範囲が制限されていて、かつ部署毎に使える容量上限が決まっているという厄介な仕様です。
(例えば下図では、「部署①のフォルダ」の共有フォルダのみ使用可能であり、その容量は部署全体で1TBまで。)

図1:私の職場環境の例

【ツール作成背景】
見積書の回覧とか、顧客ニュースリリースの周知とか、とにかく部署内で共有する資料はみんな共有フォルダ(Fドライブの中の特定のフォルダ)に一旦格納する運用になっていて、共有フォルダに保存しないと仕事が進まない訳です。
それなのに、共有フォルダの空き容量が常に逼迫しているせいで全然保存できない…。古いファイルを自分で都度削除したり、誰かがファイルを削除して空き容量が増えるのを待つしかない状況でした。
そこで、共有フォルダの空き容量を定期的に(60秒間隔で)監視するツールを考えました。

【やっていること】
・特定フォルダを、新たなネットワークドライブ「Y:」として割り当てる
 (ドライブに割り当てることで空き容量の取得が可能)
・Yドライブの空き容量を取得
・Yドライブを切断(ネットワークドライブの割り当てを解除)
・Yドライブのキャッシュを削除
・60秒待機
・〇MBの空き容量ができたことを確認するまで、上記をループ処理。

コードはこちら。

'確保したい容量(MB単位)を入力
Dim Input
Dim DInput
Dim DByte
Do
	Input = InputBox ("確保したい容量を MB 単位で入力してください", "共有フォルダの容量監視", "例:23.5")
Loop Until IsNumeric (Input)
DInput = FormatNumber(Input,1, , , 0) '小数点以下1桁、桁区切りなし表記
DByte = Int(DInput * 1024)
If DInput >= 5 Then
	Dim Ans
	Ans = MsgBox("5MB以上の容量を入力した場合、このメッセージが表示されます。" & vbCrLf & vbCrLf & _
	"このまま処理を進めても良いですか?", vbYesNo, "確認")
	If Ans = 2 Then
		WScript.Quit
	End If
End If

'共有フォルダの空き容量を確認
Do
	Dim strPubFolder
	Dim wNet
	strPubFolder = "共有フォルダのパス"
	Set wNet = WScript.CreateObject("WScript.Network")
	wNet.MapNetworkDrive "Y:" , strPubFolder , True
	
	Dim fso
	Dim scr
	Dim intFreeSpace
	Set fso = WScript.CreateObject("Scripting.FileSystemObject")
	Set scr = fso.GetDrive("Y:")
	intFreeSpace = scr.FreeSpace
	'WScript.Echo "Yドライブの空き容量は" & FormatNumber (intFreeSpace / 1024, 0, , , -1) & " KB"
	'WScript.Echo "Yドライブの空き容量は" & FormatNumber (intFreeSpace / 1024 / 1024, 1, , , -1) & " MB"
	'WScript.Echo "Yドライブの空き容量は" & FormatNumber (intFreeSpace / 1024 / 1024 / 1024, 2, , , -1) & " GB"
	Set scr = Nothing
	Set fso = Nothing

	wNet.RemoveNetworkDrive "Y:", True, True
	Set wNet = Nothing

	Dim NetworkName
	Dim cmd
	Dim wsh
	NetworkName = "*****.*****"
	cmd = "cmd.exe /c net use" & NetworkName & " /delete"
	Set wsh = CreateObject("WScript.Shell")
	wsh.Run cmd, 0, True
	Set wsh = Nothing

	If intFreeSpace > DByte Then Exit Do
	WScript.Sleep 60000
Loop
WScript.Echo DInput & " MB分の空き容量が確保できました。"

これをメモ帳に貼り付けて、拡張子を「.vbs」にして保存。
※文字コードはANSIを指定してください。
・変数strPubFolderに、共有フォルダのパス(図1で言うところの「部署①の
 共有フォルダパス」)を設定。
・変数NetworkNameに、Yドライブのネットワーク名を設定。
→予め、共有フォルダをYドライブとして割り当てた状態でコマンドプロン
 プトの「net use」を実行し、ネットワーク名を確認しておく必要あり。

会社で使っているコードをそのまま載せる訳にはいかないので、投稿用にだいぶ書き直しました。テストしてないので、動かなかったらすみません。
RemoveNetworkDriveでYドライブの割り当てを解除していますが、これだけだとキャッシュが残ったまま(エクスプローラー上でYドライブの表示が残ったまま)なので、コマンドプロンプトの「net use」でキャッシュを削除しています。キャッシュはコマンドでないと削除できません。

念のため補足しておきますが、上記の空き容量を監視するコードに加えて、「fustil file createnew」コマンド等でダミーファイルを自動生成する処理を加えると、非常に凶悪なツールになります。悪用厳禁。
共有フォルダはみんなが譲り合って使うものなので、自分勝手に容量消費しちゃダメですね。
ダミーファイルを自動生成する処理を加えたコード(完全版)も作ってはみたものの、流石に投稿するのは憚られるので、内容は以上となります。


いいなと思ったら応援しよう!