Windows net shareとrubyを利用して共有フォルダのサイズを取得する
仕事で共有フォルダのサイズを定期的に採取する必要があったので、共有名とパスを取得するスクリプトをrubyで作成してみた。
共有名とパスの取得の仕方
Windows で net shareを実行すると、次のような共有フォルダの一覧が取得できる。
> net share 共有名 パス リソース IPC$ C$ D$ Test C:¥Test MyShare D:¥MyShare LonguuuuName # 共有名が長いとパスは次の行に表示される D:¥AAA¥LonguuuuN... # パスが長いと途中で切れる
上記のようにこれだけではフルパスが取得できない事があるので、 net share 共有名 を利用してフルパスを取得する。
net share Test # 共有フォルダTestに関する詳細な情報が標準出力される
と言うわけで、net shareで共有名の一覧を取得して、そこからnet share 共有名で、フルパスを取得するrubyスクリプトを作成した。
# coding: utf-8 require 'kconv' module Windows module Net def self.each_share_folder(&block) result = `net share`.toutf8 state = :prev_header result.each_line do |line| if line =~ /^-/ state = :after_header next end # この正規表現. 共有名に空白が含まれると正しく # 処理できない。 if state == :after_header and line =~ /^([^\s$]+)/ share_name = $1.chomp if share_name.length > 0 puts share_name # 共有名に空白があるとここで失敗する。 command = "net share #{share_name}" detail = `#{command.tosjis}`.toutf8 parse_detail(detail, &block) end end end end private def self.parse_detail(detail, &block) name = "" path = "" detail.each_line do |line| if line =~ /^共有名\s*(.*)/ name = $1.chomp elsif line =~ /^パス\s*(.*)/ path = $1.chomp end end unless name.empty? or path.empty? block.call name, path if block end end end end
使い方
Windows::Net.each_share_folderを実行すると、見つかった共有名とパスをブロックに渡す。 (下記サンプル参照)
require './windows/net/net_share.rb' Windows::Net.each_share_folder do |name, path| puts name + "," + path # 共有名とフルパスを標準出力する. end
ファイルサイズの取得方法は別の記事で。