Powershell、命名空间和变量声明
Poweshell, Namespaces, and Variable Declaration
我正在制作一些 Powershell 例程来自动执行 Windows 10、防火墙、服务和任务计划程序的任务。
- Windows 10 专业版 x64
- Powershell 7.1.2 x64
我使用它们的名称空间公开的对象声明来声明变量,这对于在 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)
但这与您的类型一样具体。
我正在制作一些 Powershell 例程来自动执行 Windows 10、防火墙、服务和任务计划程序的任务。
- Windows 10 专业版 x64
- Powershell 7.1.2 x64
我使用它们的名称空间公开的对象声明来声明变量,这对于在 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)
但这与您的类型一样具体。