日々の記録。

プログラミングのメモや感じた事などを記録。

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

github

使い方

Windows::Net.each_share_folderを実行すると、見つかった共有名とパスをブロックに渡す。 (下記サンプル参照)

 
require './windows/net/net_share.rb'

Windows::Net.each_share_folder do |name, path|
 puts name + "," + path # 共有名とフルパスを標準出力する.
end

ファイルサイズの取得方法は別の記事で。