您必须在“ - ”运算符的右侧提供值表达式

时间:2013-09-03 00:29:17

标签: powershell

上午。

我有一个脚本可以在特定时间阻止IP,如果超过每天10次登录失败的阈值。

它可以在每个服务器上运行,但只能运行一个。 (总有一个!) 这个服务器特别是Server 2008(在其他08的工作正常)

它会抛出以下错误:

  

您必须在' - '的右侧提供值表达式   运营商。在C:\ Users \ admin \ Desktop \ Block.ps1:11 char:34   + $ arRemote = $ ar.RemoteAddresses -s<<<< PLIT( '')

这是原始代码。

$DT = [DateTime]::Now.AddHours(-24)

$l = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $DT | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} }

$g = $l | group-object -property IpAddress  | where {$_.Count -gt 10} | Select -property Name 

$fw = New-Object -ComObject hnetcfg.fwpolicy2 

$ar = $fw.rules | where {$_.name -eq 'Blacklist'} 

$arRemote = $ar.RemoteAddresses -split(',') 

$w = $g | where {$_.Name.Length -gt 1 -and !($arRemote -contains $_.Name + '/255.255.255.255') }

$w| %{ 
  if ($ar.RemoteAddresses -eq '*') {
    $ar.remoteaddresses = $_.Name
  }else{
    $ar.remoteaddresses += ',' + $_.Name
  }
}

if ($w.length -gt 1) {
  $w| %{(Get-Date).ToString() + '  ' + $_.Name >> 'C:\blocked.txt'} 
}
clear-eventlog "Security"

老实说,我不明白为什么它会在1台服务器上显示此错误,但其余的工作正常。

2 个答案:

答案 0 :(得分:4)

这肯定是因为-split运算符存在于PowerShell V3.0上但不存在于以前的版本中(请查看$PSVersionTable)语法为:

"aze,rt" -split ','

在所有Powershell版本中,您都可以使用split类的string方法:

"azer,ty".split(',')
$a = "azer,ty"
$a.split(',')

答案 1 :(得分:2)

JPBlanc是正确的,但是在PowerShell v2中添加了-split运算符而不是v3。