• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBSでExcelに複数のディスク容量を出力したい)

VBSでExcelに複数のディスク容量を出力したい

このQ&Aのポイント
  • ドメインに参加しているネットワーク上の各サーバのディスク容量をVBSを用いてExcelに出力する方法を教えてください。
  • VBSを実行し、指定したサーバ分の情報をExcelに書き込む方法について詳しく教えてください。
  • VBSのサンプルコードを実行したが、ディスク容量が正しく書き込まれない問題が発生しています。解決方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

USERNAMEに指定する「ドメイン名\ユーザ名」は「ドメインの管理者権限が付与されたアカウント」を指定して下さい。 管理者権限の無いアカウントを指定した場合は、ディスクの全体容量や使用容量を取得する際に Set Service = Locator.ConnectServer(NodeHost, "root\cimv2", USERNAME, PASSWORD) の行で「アクセス拒否エラー」が起きて、ホスト名しかセルに書き込みません。 質問者さんが「サイズが拾えない」のは「アクセス拒否エラー」が出ているからだと思われます。 >ドメイン名、ユーザ名(Administrator)、パスワードは全サーバ共通となっております。 であれば、少なくとも Const USERNAME="FOO_BER_DOMAIN\Administrator" Const PASSWORD="Admin_password" とかになってないと、期待通りに動かないと思われます。 >エラー出力されないため、どの部分が間違っているのか、書き方が悪いのかが分からず、 そういう場合は On Error Resume Next を '--- On Error Resume Next に書き換えて、エラー表示されるようにして下さい。 「On Error Resume Next」は「エラーが出ても無視して次の行を実行する」って意味ですので、デバッグ中はコメントアウトしておいて、エラーが出る状態にして実行しましょう。 そして、エラーが出ない、バグが居ないのを確認し、完成したのを確認してから、コメントアウトしていた部分を元に戻して、エラースキップするように修正して下さい。 以下のスクリプトで、添付画像の通り、正常に期待通りに動作するのを確認しています。 Const cstrDateFilename = "C:\Users\ユーザ名\Desktop\test.xlsx" Const USERNAME="ドメイン名\ユーザ名" Const PASSWORD="パスワード" Dim NodeArray Dim NodeHost Dim LD1 Dim LD2 Dim Locator Dim Service Dim iRow Dim Workbook Dim Excel Dim WorkSheet Dim tmp1 Dim tmp2 Dim tmp3 Dim tmp4 Dim tmp5 '------------------------------ NodeArray = Array("サーバ1", "サーバ2", "サーバ3", "サーバ4") '------------------------------ Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator") On Error Resume Next iRow = 1 Set Workbook = GetObject(cstrDateFilename) Set Excel = Workbook.Application Workbook.Activate Workbook.Windows(1).Visible = True Excel.Visible = True Set WorkSheet = Workbook.Worksheets(1) WorkSheet.Activate WorkSheet.Cells(iRow, 1).Value = "ホスト名" WorkSheet.Cells(iRow, 2).Value = "ドライブ名" WorkSheet.Cells(iRow, 3).Value = "ディスク全体容量" WorkSheet.Cells(iRow, 4).Value = "ディスク使用量" WorkSheet.Cells(iRow, 5).Value = "ディスク空き容量" WorkSheet.Cells(iRow, 6).Value = "ディスク使用率" For Each NodeHost In NodeArray Set Service = Locator.ConnectServer(NodeHost, "root\cimv2", USERNAME, PASSWORD) Set LD1 = Service.ExecQuery("Select * From Win32_LogicalDisk") For Each LD2 In LD1 tmp1 = LD2.DeviceID if isnull(LD2.Size) then tmp2 = "N/A" tmp3 = "N/A" tmp4 = "N/A" tmp5 = "N/A" else tmp2 = Round(LD2.Size / 1024 / 1024 / 1024, 2) if isnull(LD2.FreeSpace) then tmp3 = "N/A" tmp4 = "N/A" tmp5 = "N/A" else tmp3 = Round((LD2.Size - LD2.FreeSpace) / 1024 / 1024 / 1024, 2) tmp4 = Round(LD2.FreeSpace / 1024 / 1024 / 1024, 2) tmp5 = Round((LD2.Size - LD2.FreeSpace) / LD2.Size, 2) end if end if iRow = iRow + 1 WorkSheet.Cells(iRow, 1).Value = NodeHost WorkSheet.Cells(iRow, 2).Value = tmp1 WorkSheet.Cells(iRow, 3).Value = tmp2 WorkSheet.Cells(iRow, 4).Value = tmp3 WorkSheet.Cells(iRow, 5).Value = tmp4 WorkSheet.Cells(iRow, 6).Value = tmp5 if IsNumeric(tmp5) then WorkSheet.Cells(iRow, 6).NumberFormatLocal = "0.00%" end if Next Set Service = Nothing Set LD1 = Nothing Set LD2 = Nothing Next Set WorkSheet = Nothing Set Excel = Nothing Set Workbook = Nothing なお「要らない関数は削除」「EXCELワークブックを開くのは最初の1回だけにする」「見出しはスクリプトで書き込む」「次のサーバーに接続する前にオブジェクトを開放する」「サイズが取得できないドライブはN/Aと書き込む」など、改良を施してあります。

mato_faq
質問者

お礼

ご回答ありがとうございました。 ご指摘のとおり、管理者権限をもっていないユーザで実施していたようです。 修正くださったサンプルコードまで提示いただき、感謝しきれません。 一部サーバでCドライブが出力されず、Eドライブ等の存在しないドライブ名を引っ張ってきて結果がN/Aというのはありますが、5台程度であるため手動で乗り切りつつ、別の方法も検討してみたいと思います。 重ね重ね、今回は本当にありがとうございました。

その他の回答 (1)

回答No.2

一部訂正。 tmp5 = Round((LD2.Size - LD2.FreeSpace) / LD2.Size, 2) は tmp5 = Round((LD2.Size - LD2.FreeSpace) / LD2.Size, 4) に直して下さい。 パーセントを小数点以下2桁まで表示する場合は、小数点以下4桁で計算する必要があるのを忘れて、小数点以下2桁で計算してしまいました。

mato_faq
質問者

お礼

訂正までご提示くださり、ありがとうございました。 期待通りの結果が出力されるVBSになり、本当に満足しております。