WMI 任务:文件和文件夹

文件和文件夹的 WMI 任务通过 WMI 更改文件或文件夹属性,包括创建共享或重命名文件。 如果要复制文件或读取和写入文件,最简单的方法是使用 Windows Script Host FileSystemObject 而不是 WMI。 有关其他示例,请参阅 TechNet ScriptCenter文件和文件夹部分。

CIM_DataFile 是 WMI 中实现的为数不多的 CIM 类之一。 避免枚举或查询计算机上 CIM_DataFile 的所有实例,因为数据量可能会影响性能或导致计算机停止响应。

本主题中显示的脚本示例仅从本地计算机获取数据。 有关如何使用脚本从远程计算机获取数据的详细信息,请参阅连接到远程计算机上的 WMI

以下过程介绍如何运行脚本。

要运行脚本

  1. 复制代码并将其保存在扩展名为 .vbs 的文件中,例如 filename.vbs。 确保文本编辑器不会向文件添加 .txt 扩展名。
  2. 打开命令提示符窗口,并导航到保存文件的目录。
  3. 在命令提示符处键入 cscript filename.vbs
  4. 如果无法访问事件日志,请检查是否从提升的命令提示符运行。 某些事件日志(如安全事件日志)可能会受到用户访问控制 (UAC) 的保护。

注意

默认情况下,cscript 会在命令提示符窗口中显示脚本的输出。 由于 WMI 脚本可以生成大量输出,因此可能需要将输出重定向到文件。 在命令提示符下键入 cscript filename.vbs > outfile.txt,将 filename.vbs 脚本的输出重定向到 outfile.txt

下表列出了可用于从本地计算机获取各种类型数据的脚本示例。

如何实现... WMI 类或方法
...重命名文件而不收到错误消息? 使用 CIM_DataFile 类。 在调用 Rename 方法时,请确保传递整个路径名,例如"C:\Scripts\Test.txt"而不是"Text.txt"。 对于 PowerShell,使用 CIM_DataFile 可能效率低下。 因此,只需使用 Rename-Item cmdlet 即可。
VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "!\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery ("Select * from CIM_DataFile where Name = " & "'c:\\scripts\\toggle_service.vbs'")
For Each objFile in colFiles
    errResult = objFile.Rename("c:\scripts\toggle_service.old")
Next
PowerShell
rename-item c:\scripts\toggle_service.vbs toggle_service.old
...确定用户是否在其计算机上存储了 .MP3 文件?

使用 CIM_DataFile 类,并使用以下 WQL WHERE 子句:Where Extension = "MP3",选择文件。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery("Select * from CIM_DataFile where Extension = 'mp3'")
For Each objFile in colFiles
    Wscript.Echo "File Name: " & objFile.Name & "." & objFile.Extension
    Wscript.Echo "Path: " & objFile.Path
Next
PowerShell
Get-WmiObject -Class CIM_DataFile -namespace "root\cimv2" -Filter "Extension = 'mp3'" | `
   format-list Name, Extension, Path
...在计算机上创建共享文件夹?

使用 Win32_Share 类和 Create 方法。

VB
Const FILE_SHARE = 0
Const MAXIMUM_CONNECTIONS = 25
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewShare = objWMIService.Get("Win32_Share")
errReturn = objNewShare.Create("C:\Finance", "FinanceShare", FILE_SHARE, MAXIMUM_CONNECTIONS, "Public share for the Finance group.")

PowerShell
$FILE_SHARE = 0 $MAXIMUM_CONNECTIONS = 25 

$NewDir = new-item C:\Finance -type directory $Shares= [WMICLASS]"Win32_Share" [void]$Shares.Create("C:\Finance","FinanceShare", $FILE_SHARE, $MAXIMUM_CONNECTIONS, "Public share for the Finance group.")

...复制文件夹?

使用 Win32_Directory 类和 Copy 方法。 对于 PowerShell,只需使用 Copy-Item cmdle 即可。

VB
strComputer = "." 
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
 
Set colFolders = objWMIService.ExecQuery("Select * from Win32_Directory where Name = 'c:\\Scripts'") 
 
For Each objFolder in colFolders 
    errResults  = objFolder.Copy("D:\Archive") 
Next 
PowerShell
Copy-Item C:\Scripts -Destination D:\Archive -Recurse
...移动文件夹?

使用 Win32_Directory 类和 Rename 方法。 对于 PowerShell,只需使用 Move-Item cmdlet 即可。

VB
strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
 
Set colFolders = objWMIService.ExecQuery _ 
    ("Select * from Win32_Directory where name = 'c:\\Scripts'") 
 
For Each objFolder in colFolders 
    errResults = objFolder.Rename("C:\Admins\Documents\Archive\VBScript") 
Next
PowerShell
move-item -path C:\Scripts -destination C:\Admins\Documents\Archive\PowerShell

脚本和应用程序的 WMI 任务

WMI C++ 应用程序示例

TechNet ScriptCenter

`