首先让我说我在编写脚本或对其进行故障排除方面一点也不擅长,因此我在这里:)
我正在尝试查找 Windows 域网络中使用静态 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
我追踪了从脚本中删除“-”的方法,然后得到了这个错误:
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
我究竟做错了什么?或者我应该从脚本中添加/删除什么以使其运行?
谢谢,
反引号 ` 是行继续符,您得到“一元运算符后缺少表达式”的第一个错误似乎是 PowerShell 没有将 -Query 行视为前一行的一部分。
可能您在脚本副本中的上一行末尾缺少 `,或者通过某些复制/粘贴/字体/编辑器代码修改或其他东西的怪癖将其替换为撇号。
删除其中的大部分,对于您想要的东西来说,它是令人费解的、丑陋的和多余的。
为什么要查询
Win32_NetworkAdapterConfiguration
事物并调用它们ints
?这太误导人了。为什么它接受
IPAddress
,调用它addr
,然后调用它ip
,然后调用它IP
?它为什么要接
GatewayAddress
,叫它gw_addr
,然后gw
,然后Gateway
呢?测试
-eq $null
似乎是不必要的,如果您尝试foreach
在空序列上使用它将按预期工作(跳过它)。使用正则表达式来获取 IPv4 地址而不是 IPv6 地址 - 很有用,但很笨拙。IPv6 地址用于
:
分隔它们,而 IPv4 地址使用.
,因此如果您只关心 IPv4 地址,只需.
在地址中查找 a 。为什么要复制地址,建立一个结果列表,然后从列表中选择所有内容,而您可以在找到地址时打印它?
你甚至关心网关地址吗?
当您处于此时正在处理 IP 地址的块中时,为什么要测试 IP 地址是否为空,因此此时它不能为空?
get-computers % { code } | select results
当这对您没有帮助时,为什么要使用整个链条?我对它进行了一些修剪并重命名了一些东西,并得到了以下更清晰、更简单的结构:
.
显示计算机名称和此 IPv4 地址。
我尚未对此进行完全测试,但它适用于一台计算机,仅显示名称和静态 IP。
请注意,它不会向您显示它无法联系的任何计算机的名称,但原始计算机也不会显示。
您需要注意网页如何切割您的代码。这是我的修改版本,由 OU 使用,以防您不希望每台计算机都经过测试,并且在运行时有更多信息。
我在我的项目中使用它来重建 AD 域控制器,以便找到需要更改 DNS 的静态 IP,并且它可以 100% 工作!