让我开始说我不擅长编写脚本或排除故障,因此我在这里:)
我试图find所有在Windows域networking中使用静态IP地址的计算机,我在网上做了一个小的研究,发现这个PowerShell脚本如下:
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}\.[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}\.[0-9]{1,3}\.[0-9]{1,3}\.[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
我find了从脚本中删除“ – ”的方法,然后得到这个错误:
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
我究竟做错了什么? 或者我应该添加/删除脚本,使其运行?
谢谢,
我究竟做错了什么?
反引号是行继续字符,并且第一个错误是“在一元运算符之后缺lessexpression式”看起来是PowerShell没有看到-Query行作为上一行的一部分。
可能你错过了“在脚本副本的前一行末尾,或者被一些撇号复制/粘贴/字体/编辑器代码混乱的东西所代替。
或者我应该添加/删除脚本,使其运行?
删除它的大部分,它是复杂的,丑陋的,你想要的多余。
为什么它查询Win32_NetworkAdapterConfiguration东西,并称他们ints ? 这太误导了
为什么要把IPAddress ,叫做addr ,然后调用ip ,然后调用它的IP ?
为什么要把GatewayAddress ,称为gw_addr ,然后gw ,然后Gateway ?
-eq $null的testing似乎是不必要的,如果你尝试在一个空序列上使用foreach ,它将按预期工作(跳过它)。
使用正则expression式来获取IPv4地址,而不是IPv6地址 – 有用,但waffly。 IPv6地址使用:分隔它们,使用IPv4地址. ,所以如果你只关心IPv4地址,只要找一个. 在地址。
为什么要复制地址,build立一个结果列表,然后从列表中select所有的东西,当你可以打印地址时,你会发现它?
你甚至关心网关地址?
为什么要testingIP地址是否为空,当你在一个正在处理这个IP地址的块中时,在这一点上它不能为空?
为什么整个事情是一个使用get-computers % { code } | select results的链 get-computers % { code } | select results ,什么时候对你没有帮助?
我修剪了一下,重新命名了一些东西,并得到了下面更清晰,更简单的结构:
. 显示计算机名称和此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 } } } }
我还没有完全testing过,但它对一台计算机只显示名称和静态IP。
注意它不会显示任何不能联系的计算机名称,但是也不会显示原来的名称。
你需要小心网页如何削减你的代码。 这是我的修改版本,由OU工作的情况下,你不希望每一台计算机testing,并有更多的信息,因为它运行。
############################################################################ ## ## Script, that returns list of computers with first statically configured ## IP Address and Default Gateway. ## Requires Active Directory Module ## ## Version: 1.0 ## Author: [email protected] ## Date: 07#23#2012 ## ############################################################################ # %Debug Arguments%='"Value1" "-Verbose"' param ( [string]$LDAPFilter = '(name=*)', [switch]$Verbose ) import-module ActiveDirectory # $LDAPFilter = '(name=*)' # $Verbose = $True if ($Verbose.IsPresent) { $VerboseModeString = "enabled." $VerboseModeVar = $True } Else { $VerboseModeString = "not enabled." $VerboseModeVar = $False } # $VerboseModeVar = $True Write-Host "Verbose mode is $VerboseModeString" -ForegroundColor Magenta # LDAP Paths: $Singapore_OU = "OU=Singapore,OU=APAC,OU=TopOU,DC=MyDomain,DC=com" $BC_OU = "OU=BC,OU=Australia,OU=APAC,OU=TopOU,DC=MyDomain,DC=com" $MAL_OF_OU = "OU=KL Office,OU=Malaysia,OU=APAC,OU=TopOU,DC=MyDomain,DC=com" $HK_OU = "OU=HK Warehouse,OU=Hong Kong,OU=APAC,OU=TopOU,DC=MyDomain,DC=com" Get-ADComputer -SearchBase $HK_OU -LDAPFilter $LDAPFilter | % ` { $name = $_.DNSHostName; if ($VerboseModeVar) { 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}\.[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}\.[0-9]{1,3}\.[0-9]{1,3}\.[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 } } } } } } else { if ($Verbose.IsPresent) { Write-Host "--> Could not contact the computer $Name" -ForegroundColor Red } } } | Select-Object Name, IP, Gateway
我已经在我的项目中使用这个来重buildAD域控制器,以便find需要DNS更改的静态IP,并且它工作100%!