• ベストアンサー

なぜAドライブが起動するのでしょうか

こんにちは。 あるフォルダに含まれるすべてのファイルを表示するというスクリプトを検討していたら以下のスクリプトを見つけました。 このスクリプトをコピーして自分の端末で実行してみたところ、処理は問題なく動くのですが、実行途中でなぜかAドライブを見に行ってしまいます。(見に行った結果エラーになるわけではありません) 出来ればAドライブのチェックは必要ないので、しないように出来たら嬉しいです。 よろしくお願い致します。 【スクリプト情報】 http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/feb05/hey0218.mspx ※同様の内容で一度質問をしましたが、スクリプトの内容が違っていました。すいませんでした。

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

  • ベストアンサー
  • MidKnight
  • ベストアンサー率57% (20/35)
回答No.1

このスクリプト、すべてのパスの中から必要なフォルダをクエリで取り出していますね。 全てのパスを確認する過程で、Aドライブも見に行ってるんじゃないでしょうか。 ファイル一覧を作るだけが目的なら、ファイルシステムオブジェクトで十分です。 WMIなんて必要ない。 Set objFso = CreateObject("Scripting.FileSystemobject") strPath = "C:\test" If objFso.FolderExists(strPath) = True Then Call ListUp(strPath) Else WScript.Echo "指定されたパスはフォルダではありません" End If Sub ListUp(strPath) Set objFolder = objFso.GetFolder(strPath) For Each objFile In objFolder.Files WScript.Echo objFile.Name '名前だけ表示させる場合 WScript.Echo objFile.Path 'パスを表示させる場合 Next For Each objSubFolder In objFolder.Subfolders ListUp(objSubFolder.Path) Next End Sub この方がずっと簡単でしょう。

Gami7
質問者

お礼

おおー、すばらしいです。 元々はVBスクリプトで作成出来ない情報を探していたのですが、またまた見つけたのがWMIだったので質問してみた次第です。 プログラムがこんなにスッキリと出来るなんで感動ものです。 処理も速いし、完璧だと思います。 本当にありがとうございました。

その他の回答 (3)

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.4

もう一例、WWWをあさって試しました。WMIスッキリ版。 ----- strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") strFolderName = "c:\test" GetSubFolders strFolderName Sub GetSubFolders(strFolderName) Wscript.Echo strFolderName Set colFiles = objWMIService.ExecQuery _ ("ASSOCIATORS OF {Win32_Directory.Name='" & strFolderName & "'} Where " _ & "ResultClass = CIM_DataFile") For Each objFile in colFiles Wscript.Echo objFile.Name Next Set colSubfolders2 = objWMIService.ExecQuery _ ("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _ & "Where AssocClass = Win32_Subdirectory " _ & "ResultRole = PartComponent") For Each objFolder2 in colSubfolders2 GetSubFolders objFolder2.Name Next End Sub -----

Gami7
質問者

お礼

こんなにシンプルに出来るもんなんですね。 ただただ感動です。 ありがとうございます。大変参考になりました。

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.3

MSのサンプルは ANo.1 MidKnightさんが言われているようにドライブの指定が抜けていますね。例えば a:\test\xxx.txt などが存在するとそれも表示されてしまいます。 WMIにこだわるならばDrive指定を追加して下記でいけます。Windows XP Pro SP2で確認しました。 ----- strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") strFolderName = "c:\test" Set colSubfolders = objWMIService.ExecQuery _ ("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _ & "Where AssocClass = Win32_Subdirectory " _ & "ResultRole = PartComponent") Wscript.Echo strFolderName arrFolderPath = Split(strFolderName, "\") strNewPath = "" For i = 1 to Ubound(arrFolderPath) strNewPath = strNewPath & "\\" & arrFolderPath(i) Next strPath = strNewPath & "\\" Set colFiles = objWMIService.ExecQuery _ ("Select * from CIM_DataFile where Drive = '" & arrFolderPath(0) & "'" & _ " and Path = '" & strPath & "'") For Each objFile in colFiles Wscript.Echo objFile.Name Next For Each objFolder in colSubfolders GetSubFolders strFolderName Next Sub GetSubFolders(strFolderName) Set colSubfolders2 = objWMIService.ExecQuery _ ("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _ & "Where AssocClass = Win32_Subdirectory " _ & "ResultRole = PartComponent") For Each objFolder2 in colSubfolders2 strFolderName = objFolder2.Name 'Wscript.Echo 'WScriptだと空の表示が気持ち悪いので削除 Wscript.Echo objFolder2.Name arrFolderPath = Split(strFolderName, "\") strNewPath = "" For i = 1 to Ubound(arrFolderPath) strNewPath = strNewPath & "\\" & arrFolderPath(i) Next strPath = strNewPath & "\\" Set colFiles = objWMIService.ExecQuery _ ("Select * from CIM_DataFile where Drive = '" & arrFolderPath(0) & "'" & _ " and Path = '" & strPath & "'") For Each objFile in colFiles Wscript.Echo objFile.Name Next GetSubFolders strFolderName Next End Sub -----

Gami7
質問者

お礼

なるほど、ドライブ指定の設定が抜けていた訳で、 Drive = '" & arrFolderPath(0) の設定をすることによりいちいちAドライブを見に行くのを解消出来るとは。勉強になりました。 ありがとうございました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

何をしているかもわからないスクリプトを実行してしまう貴方の度胸がスゴイです。

Gami7
質問者

お礼

お褒めのお言葉、恐縮です。 何せ、常にチャレンジャーなもんで。