【问题标题】:WMI Query returning null collection when querying Win32_DirectoryWMI 查询在查询 Win32_Directory 时返回空集合
【发布时间】:2014-08-18 20:52:29
【问题描述】:

我正在尝试使用 VBScript 选择特定文件夹中的所有 csv,然后将它们连接成一个。我正在使用 Win32_Directory 上的 ExecQuery 将所有 csv 添加到集合中,并指定路径和扩展属性。我在文件夹中有五个 csv 来测试。但返回的集合始终为空。

这是我的代码:

strComputer = "."
Set wshShell = WScript.CreateObject( "WScript.Shell" )
Set objWMIService = GetObject("winmgmts:" _
   & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

'Options for CreateTextFile
boolOverwrite = True
boolUnicode = True

'Options for OpenTextFile
constForReading = 1
constForWriting = 2
constForAppending = 8
boolCreate = False
constTristate = -1

strPath = "C:\Users\adam\Documents\Test\Temp.csv"
strDrivePath = "C:\Users\adam\Documents\Test"

'Creates object reference to files in relevant folder.
Set objFSO = CreateObject ("Scripting.FileSystemObject")

'Creates new CSV to write others' contents to.
Set objNew = objFSO.CreateTextFile(strPath,boolOverwrite,boolUnicode)

Set colCSV = objWMIService.ExecQuery _
 ("SELECT * FROM Win32_Directory WHERE Path = strDrivePath AND Extension = 'csv'")

'Concatenates contents of CSVs
For Each objCSV in colCSV
 Set objTemp = objFSO.OpenTextFile(objCSV.Path & objCSV.FileName & objCSV.Extension,constForReading,boolCreate,constTristate)
 Set strLine = objTemp.ReadLine
 objNew.Write strLine 

Next

我也不确定我为 OpenTextFile 指定路径的方式是否有效。但我现在主要关心的是让查询返回我想要的文件。

感谢您的帮助!

【问题讨论】:

    标签: csv vbscript wmi wql


    【解决方案1】:

    这里有一些问题。

    1. 如果您想选择文件,请使用CIM_DataFile 类。 Win32_Directory 用于,你猜对了,目录。

    2. Path 属性中的反斜杠必须转义 (\\)。

    3. strDrivePath 是一个变量,但您在 WMI 查询中按字面意思使用它。

    4. 您是否打算在远程计算机上运行此脚本?如果没有,为什么不使用FileSystemObject 方法?您已经创建了一个 FSO 对象。

    Here 是我过去回答的一个类似问题,它展示了如何使用 FileSystemObject 或 WMI 查询来查找符合规范的文件。

    在这种情况下,您的查询可能如下所示:

    strFileSpec = "C:\\Users\\Adam\\Documents\\Test\\%.csv"
    
    Set colCSV = objWMIService.ExecQuery _
     ("select * from CIM_DataFile where Name like '" & strFileSpec & "'")
    

    但是,如果您在语句中指定 DrivePath 的值,您的查询会运行得更快(通常很明显)。有关示例,请参阅我的链接帖子。

    编辑:我刚刚意识到您也是我所链接问题的 OP!

    【讨论】:

    • 感谢您的帮助!是的,我认为 Win32_Directory 用于文件很奇怪。但是 MSDN 条目让它听起来像是可以工作的。我不知道,我仍然不太擅长阅读 MSDN。我正在使用 WMI 而不是 FSO,因为我阅读了一些关于它的内容,看起来使用 WMI 应该更快。我在一个不仅仅是 CSV 的文件夹中查询。而且,根据我的阅读,只有在选择文件夹中的所有内容时,FSO 才能更快地工作。无论哪种方式,我的代码仍然无法正常工作。它没有进入 For Each 语句。但至少这给了我一个开始。
    • 实际上,如果您知道为什么它不会进入 For Each 语句,那就太好了。我一直在试图弄清楚。但我似乎无法到达任何地方。我在 For Each 的两侧放置了一个 echo 语句,以确保查询正常工作。我也尝试过使用这个 For Each 来确保集合不是问题: For Each objCSV in colCSV wscript "A" Next 但它也不会输入该语句。
    • 尝试 FSO 路线。真的。它要容易得多,而且我无法想象 WMI 会比使用 FSO 更快。 For Each objFile In objFSO.GetFolder("C:\Users\Adam\Documents\Test").Files。这就是迭代文件夹中每个文件所需的全部内容。 If UCase(Right(objFile.Name, 4)) = ".CSV" Then。多一行来测试它是否是 CSV。
    • 好的,所以我将所有 WMI 内容更改为: For Each objFile In objFSO.GetFolder("C:\Users\Adam\Documents\Test").Files If UCase(Right(objFile .Name, 4)) = ".CSV" Then Set objTemp = objFSO.OpenTextFile(objFile.Name,constForReading,boolCreate,constTristate) Set strLine = objTemp.ReadLine objNew.Write strLine End If Next But CMD 返回“运行时错误:文件未找到”
    • 哪一行导致错误?尝试在OpenTextFile 中使用objFile.Path 而不是objFile.Name
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2018-12-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2021-11-30
    • 2022-10-22
    相关资源
    最近更新 更多