Powershell新手,如果下面的问题很傻,请耐心等待。。。
我想在Powershell中创建一个VSS快照,并发现了许多使用WMI函数来实现这一点的示例。常见的模式是
# Pattern 1
$class=[WMICLASS]"rootcimv2:win32_shadowcopy"
$class.create("C:", "ClientAccessible")
# Pattern 2
(gwmi -List Win32_ShadowCopy).Create("C:", "ClientAccessible")
我看到的所有代码都使用Powershell的WMI cmdlet然而,根据大量引用(例如这里(,我的印象是我们不应该再使用WMI cmdlet了
因此,我试图了解如何仅使用CIM cmdlet创建VSS快照,但没有成功。第一个想法是创建一个新的Win32_ShadowCopy
实例,根据需要设置其属性,并在其上调用Create
方法
PS C:UsersAdministrator> New-CimInstance Win32_ShadowCopy
New-CimInstance : Not supported
At line:1 char:1
+ New-CimInstance Win32_ShadowCopy
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotImplemented: (Win32_ShadowCopy:CimInstance) [New-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x8004100c,Microsoft.Management.Infrastructure.CimCmdlets.NewCimInstanceCommand
显然,CCD_ 3不是为CCD_ 4实现的。
在进一步的研究中,还发现(与WMI cmdlet相比(CIM cmdlet不返回可以调用Create
方法的对象(我在下面的代码中从输出中删除了一些空行(:
PS C:UsersAdministrator> get-cimclass -Class Win32_ShadowCopy
NameSpace: ROOT/cimv2
CimClassName CimClassMethods CimClassProperties
------------ --------------- ------------------
Win32_ShadowCopy {Create, Revert} {Caption, Description, InstallDate, Name...}
PS C:UsersAdministrator> get-wmiobject -List Win32_ShadowCopy
NameSpace: ROOTcimv2
Name Methods Properties
---- ------- ----------
Win32_ShadowCopy {Create, Revert} {Caption, ClientAccessible, Count, Description...}
据我所知,以上内容表明get-cimclass
和get-wmiobject
返回的对象应该公开相同的方法。但是,当我们尝试调用Create
方法时:
PS C:UsersAdministrator> $(get-wmiobject -List win32_shadowcopy).Create("C:", "ClientAccessible")
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ReturnValue : 0
ShadowID : {8918619B-BE7F-4FE2-9B9C-C6B3B71CC749}
PSComputerName :
PS C:UsersAdministrator> $(get-cimclass -Class Win32_ShadowCopy).Create("C:", "ClientAccessible")
Method invocation failed because [Microsoft.Management.Infrastructure.CimClass] does not contain a method named 'Create'.
At line:1 char:3
+ $(get-cimclass -Class Win32_ShadowCopy).Create("C:", "ClientAccessib ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
显然,我不能使用get-cimclass
来创建卷影副本。get-ciminstance
也是如此;如果至少有一个快照已经存在,则后者将失败,并显示与get-cimclass
相同的错误消息,否则将抛出另一个错误,因为此时返回的对象为空。
那么,我需要做些什么才能仅使用CIM cmdlet创建卷影副本呢?
我刚开始玩这个,但这个命令似乎有效:
Invoke-CimMethod -MethodName Create -ClassName Win32_ShadowCopy -Arguments @{ Volume= "C:\" }
正如您所注意到的,您不能直接在实例上调用CIM方法。由于Cim cmdlet通过远程处理来工作,因此实例不活动(有些人说已脱水(,并且方法已删除。因此;不包含名为…的方法"InvokeCimMethod就是为了解决这个问题。
我确实发现发现有时可能很棘手,但它是可行的。例如,我以前从未使用过这个类,但很容易找到可能的调用示例,比如:
(Get-CimClass Win32_ShadowCopy).CimClassMethods
Name ReturnType Parameters Qualifiers
---- ---------- ---------- ----------
Create UInt32 {Context, Volume, ShadowID} {constructor, implemented, static}
Revert UInt32 {ForceDismount} {implemented}
我在一分钟内完成了所有。。。
注意:您是正确的Get-WMIObject
等已被弃用,并且已从PowerShell 7+中删除。最好继续使用Cim cmdlet,并在它们出现时完成这些调整。。。
CIM Cmdlets 简介
Scripting Guys CIM Vs WMI