我正在尝试找到使用静态IP地址的Windows域网络中的所有计算机,我在网上进行了一项小型研究,发现this PowerShell script如下:
param ( [string]$LDAPFilter = '(name=*)',[switch]$Verbose ) Get-ADComputer -LDAPFilter $LDAPFilter | % ` { $name = $_.DNSHostName; if ($Verbose.IsPresent) { Write-Host -ForegroundColor Yellow "Connecting to $name..." } $ints = Get-WmiObject -ErrorAction SilentlyContinue -ComputerName $name ` -Query "select IPAddress,DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=FALSE"; if ($ints -ne $null) { foreach ($int in $ints) { foreach ($addr in $int.IPAddress) { $ip = $null if ($addr -match "[0-9]{1,3}\.[0-9]{1,3}") { $ip = $addr $gw = $null foreach ($gw_addr in $int.DefaultIPGateway) { if ($gw_addr -match "[0-9]{1,3}") { $gw = $gw_addr break } } if ($ip -ne $null) { $info = New-Object PSObject -Property ` @{ Name = $name IP = $ip Gateway = $gw } $info if ($Verbose.IsPresent) { Write-Host -ForegroundColor Yellow $info } } } } } } } | Select-Object Name,IP,Gateway
我试图在我的Active Directory服务器上运行它,问题是,脚本在运行时出错,如下所示:
Missing expression after unary operator '-'. At C:\Users\Administrator.MyDomain\Desktop\ComputersWithStaticIP.ps1:24 char:8 + - <<<< Query "select IPAddress,DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE an d DHCPEnabled=FALSE"; + CategoryInfo : ParserError: (-:String) [],ParseException + FullyQualifiedErrorId : MissingExpressionAfterOperator
ForEach-Object : Cannot bind parameter 'Process'. Cannot convert the " " value of type "System.String" to type "System.Management.Automation.ScriptBlock". At C:\Users\Administrator.MyDomain\Desktop\ComputersWithStaticIP.ps1:18 char:2 + % <<<< ` + CategoryInfo : InvalidArgument: (:) [ForEach-Object],Parameter BindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerSh ell.Commands.ForEachObjectCommand
我究竟做错了什么?或者我应该在脚本中添加/删除什么才能使其运行?
谢谢,
What am I doing wrong?
反引号`是行继续符,你得到的’一元运算符后缺少表达式’的第一个错误似乎是PowerShell没有看到-Query行作为前一行的一部分.
可能你错过了脚本副本中前一行末尾的`,或者通过一些复制/粘贴/字体/编辑器代码修改等问题将其替换为撇号.
or what should I add/remove from the script to make it run?
删除它的大部分,它是令人费解的,丑陋的,多余的,你想要的.
为什么要查询Win32_NetworkAdapterConfiguration事件并将它们称为int?这太误导了.
为什么要使用IPAddress,将其称为addr,然后将其称为ip,然后将其称为IP?
为什么它采用GatewayAddress,称之为gw_addr,然后是gw,然后是Gateway?
对-eq $null的测试似乎是不必要的,如果你尝试在空序列上使用foreach它将按预期工作(跳过它).
使用正则表达式来获取IPv4地址而不是IPv6地址 – 这很有用,但非常有用. IPv6地址使用:分隔它们,IPv4地址使用.,所以如果你只关心IPv4地址,只需要查找.在地址.
为什么要复制地址,建立结果列表,然后选择列表中的所有内容,何时可以在找到地址时打印地址?
你甚至关心网关地址吗?
为什么在此处处理IP地址的块中测试IP地址是否为空,以便此时它不能为空?
为什么整个事情都是使用get-computers%{code} |的链选择结果,什么时候对你没有帮助?
我把它修了一下并重新命名,得到了以下更清晰,更简单的结构:
>设置.
>拿到电脑
>对于每台计算机,获取具有静态地址的网络接口.
>对于每个接口,获取IP地址.
>对于每个IP地址,通过查找来识别IPv4.
>显示计算机名称和此IPv4地址.
param ( [string]$LDAPFilter = '(name=*)' ) $wmiQuery = "select IPAddress,DefaultIPGateway from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE and DHCPEnabled=FALSE" $computers = (Get-ADComputer -LDAPFilter $LDAPFilter) foreach ($computer in $computers) { $networkAdapters = (Get-WmiObject -ErrorAction SilentlyContinue -ComputerName $computer.DNSHostName -Query $wmiQuery) foreach ($networkAdapter in $networkAdapters) { foreach ($ip in $networkAdapter.IPAddress) { if ($ip -match "\.") { Write-Host $($computer.DNSHostName),$ip } } } }