使用PowerShell更改Windows防火墙设置,但不显示输出

时间:2019-05-07 14:43:48

标签: sql powershell firewall

我有一个PowerShell脚本,用于安装SQL Express,然后安装SQL Server Management Studio,最后,用于编辑Windows防火墙设置以允许远程连接到数据库。对于防火墙的更改,我正在运行的行之一是:

New-NetFirewallRule -DisplayName "MSSQL ENGINE TCP" -Direction Inbound -LocalPort 1433 -Protocol TCP -Action Allow

Write-Host 'Windows Firewall configured to allow incoming connections on TCP port 1433'

理想情况下,我希望输出为:

Windows Firewall configured to allow incoming connections on TCP port 1433

相反,我得到:

Caption                 :
Description             :
ElementName             : MSSQL ENGINE TCP
InstanceID              : {752a3c18-298f-4639-a462-4cc5205b1016}
CommonName              :
PolicyKeywords          :
Enabled                 : True
PolicyDecisionStrategy  : 2
PolicyRoles             :
ConditionListType       : 3
CreationClassName       : MSFT|FW|FirewallRule|{752a3c18-298f-4639-a462- 
4cc5205b1016}
ExecutionStrategy       : 2
Mandatory               :
PolicyRuleName          :
Priority                :
RuleUsage               :
SequencedActions        : 3
SystemCreationClassName :
SystemName              :
Action                  : Allow
Direction               : Inbound
DisplayGroup            :
DisplayName             : MSSQL ENGINE TCP
EdgeTraversalPolicy     : Block
EnforcementStatus       : NotApplicable
LocalOnlyMapping        : False
LooseSourceMapping      : False
Owner                   :
Platforms               : {}
PolicyStoreSource       : PersistentStore
PolicyStoreSourceType   : Local
PrimaryStatus           : OK
Profiles                : 0
RuleGroup               :
Status                  : The rule was parsed successfully from the store. (65536)
StatusCode              : 65536
PSComputerName          :
Name                    : {752a3c18-298f-4639-a462-4cc5205b1016}
ID                      : {752a3c18-298f-4639-a462-4cc5205b1016}
Group                   :
Platform                : {}
LSM                     : False
Profile                 : Any

Windows Firewall configured to allow incoming connections on TCP port 1433

是否有一种简便的方法来消除所有多余的内容以使其无法在PowerShell窗口中显示?我知道我可以创建第二个脚本并提示其在单独的窗口中运行,但是我正在尝试使用单个脚本来完成此操作。

2 个答案:

答案 0 :(得分:2)

以下内容将禁止命令输出并仍然执行命令:

$null = New-NetFirewallRule -DisplayName "MSSQL ENGINE TCP" -Direction Inbound -LocalPort 1433 -Protocol TCP -Action Allow
Write-Host 'Windows Firewall configured to allow incoming connections on TCP port 1433'

将输出保存到$null时,该输出将被删除。

您还可以强制转换为[void],在某些情况下,其性能可能比分配给$null更好。

[void](New-NetFirewallRule -DisplayName "MSSQL ENGINE TCP" -Direction Inbound -LocalPort 1433 -Protocol TCP -Action Allow)

无论哪种情况,性能方面的影响都可以忽略不计。在所有情况下,您应该避免使用Out-Null ,因为这样做总是比较慢。

通常不建议使用Write-Host,但是由于我不知道您如何调用或执行代码,因此将其保留在那里。如果要在PowerShell控制台中执行此操作,则只需将引号内的文本本身留在一行上即可。

以下是一些性能测试,用于比较这三种方法:

无效:

$list = @() -as [system.collections.arraylist]
measure-command {(1..10000) | Foreach-Object {$list.add($_) | Out-Null} } | Select-Object -Property ticks,totalmilliseconds

  Ticks TotalMilliseconds
  ----- -----------------
6354765          635.4765

[无效]:

$list = @() -as [system.collections.arraylist]
measure-command {(1..10000) | Foreach-Object {[void]$list.add($_)} } | Select-Object -Property ticks,totalmilliseconds

  Ticks TotalMilliseconds
  ----- -----------------
1323269          132.3269

$ null:

$list = @() -as [system.collections.arraylist]
measure-command {(1..10000) | Foreach-Object {$null = $list.add($_)} } | Select-Object -Property  ticks,totalmilliseconds

  Ticks TotalMilliseconds
  ----- -----------------
1269874          126.9874

答案 1 :(得分:1)

运行cmdlet。移至Out-Null。如果先前的命令成功,则显示消息。

New-NetFirewallRule -DisplayName "MSSQL ENGINE TCP" -Direction Inbound -LocalPort 1433 -Protocol TCP -Action Allow | Out-Null
if($?){Write-Host 'Windows Firewall configured to allow incoming connections on TCP port 1433'}

您可以将其插入到您的方案中,但您会了解我在做什么。