Powershell、命名空间和变量声明

Poweshell, Namespaces, and Variable Declaration

我正在制作一些 Powershell 例程来自动执行 Windows 10、防火墙、服务和任务计划程序的任务。

我使用它们的名称空间公开的对象声明来声明变量,这对于在 Windows 服务上运行的函数非常有效。如下:

using namespace System
using namespace System.ServiceProcess  # ServiceController exposure

调用 System.ServiceProcess objects/library,公开 ServiceController 对象,以便我可以这样声明变量或函数 returns。

[ServiceController] $WmplayerNetSrv = (Get-Service -Name "WMPNetworkSvc" -ErrorAction Stop)

这让我可以准确地知道变量是什么,并在引用变量时启用更好的智能感知列表。

一切顺利,直到我为 Windows 10 防火墙构建函数。

using namespace System
using namespace Microsoft.Management.Infrastructure #.CimInstance exposure
using namespace Microsoft.Management.Infrastructure.CimInstance#root/standardcimv2    # /MSFT_NetFirewallRule exposure

我知道 Powershell 中的变量不需要声明,但我真的很想这样做。

我试过:

using namespace Microsoft.Management.Infrastructure.CimInstance#root/standardcimv2
[MSFT_NetFirewallRule] $WinFwRule = (Get-NetFirewallRule -DisplayName "RULE_NAME" -ErrorAction Stop)

不起作用,抱怨找不到,MSFT_NetFirewallRule,键入。

using namespace Microsoft.Management.Infrastructure.CimInstance
[#root/standardcimv2/MSFT_NetFirewallRule] $WinFwRule = (Get-NetFirewallRule -DisplayName "RULE_NAME" -ErrorAction Stop)

不起作用,抱怨 # 和 /,我确定该类型也不起作用。

[Microsoft.Management.Infrastructure.CimInstance#root/standardcimv2/MSFT_NetFirewallRule] $WinFwRule = (Get-NetFirewallRule -DisplayName "RULE_NAME" -ErrorAction Stop)

不起作用,抱怨找不到,MSFT_NetFirewallRule,键入。

所以我的问题是,如何将变量声明为 [MSFT_NetFirewallRule]?这可能吗?我知道我可以依靠 [object[]],或者不声明它。

感谢和问候,

-njc

您的困惑可能是因为您混淆了 CIM classes 和 dotnet classes(即 dotnet 类型系统中的类型)。

MSFT_NetFirewallRule 是 CIM class(参见 MSFT_NetFirewallRule)而不是 dotnet 类型系统中的类型,就 PowerShell 而言,您的防火墙规则只是一个 dotnet CimInstance 类型的对象,带有名为 CimClass 的字符串 属性,恰好具有值 Root/StandardCimv2:MSFT_NetFirewallRule.

如果您这样做,您的代码应该可以工作:

[CimInstance] $WinFwRule = (Get-NetFirewallRule -DisplayName "RULE_NAME" -ErrorAction Stop)

但这与您的类型一样具体。