windows – 使用静态IP查找域中的计算机 – PowerShell
让我先说我在编写脚本或排除故障方面一点也不擅长,因此我在这里:)
我正在尝试找到使用静态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:UsersAdministrator.MyDomainDesktopComputersWithStaticIP.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:UsersAdministrator.MyDomainDesktopComputersWithStaticIP.ps1:18 char:2 + % <<<< ` + CategoryInfo : InvalidArgument: (:) [ForEach-Object],Parameter BindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerSh ell.Commands.ForEachObjectCommand 我究竟做错了什么?或者我应该在脚本中添加/删除什么才能使其运行? 谢谢,
反引号`是行继续符,你得到的’一元运算符后缺少表达式’的第一个错误似乎是PowerShell没有看到-Query行作为前一行的一部分. 可能你错过了脚本副本中前一行末尾的`,或者通过一些复制/粘贴/字体/编辑器代码修改等问题将其替换为撇号.
删除它的大部分,它是令人费解的,丑陋的,多余的,你想要的. 为什么要查询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} |的链选择结果,什么时候对你没有帮助? 我把它修了一下并重新命名,得到了以下更清晰,更简单的结构: >设置. 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 } } } } 我没有完全测试过,但是它可以在一台计算机上显示名称和静态IP. 注:它不会向您显示任何它无法联系的计算机名称,但是原来的也不会. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-8 – 具有无法捕获的崩溃的WinJS应用程序
- windows-7 – Windows 7失去了网络连接,但没有别
- rest – Microsoft Graph API选择并过滤日历中的
- active-directory – 使用DSMOD解锁AD用户帐户(命
- 如果jar文件>一定大小,Applet无法在Windows 7上加
- windows – 可以在没有浏览器插件的情况下安装ja
- Microsoft BizTalk Server与Azure AppFabric Ser
- 哪里可以获得windows apache服务器的mod_spdy?
- 在uint8_t(C)中以原子方式存储值
- windows-sbs-2008 – SBS 2008可以浏览共享,但不