我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。
我有这个:
$ix = [System.Net.Dns]::GetHostEntry('<some server with a range of multiple IP addresses here>).AddressList.IPAddressToString;
$e = If ($ix -ne $null) {$ix | % { $_.split('.')[0..1] -join '.'} | % {$_ + '.'}} ;
$r = Get-NetRoute | ? AddressFamily -eq 'IPv4' | Select -exp 'DestinationPrefix'; ForEach ($e in $e) {$xline = $r -match $e}; write $xline
$ ix是从服务器返回到列表中的IP地址范围,然后进行操作以获得$ e。
$ e是从IP地址列表派生的每个IP地址的前两个八位字节的列表。
$ r是路由表的IPv4地址
目的是将$ e中IP地址的前两个八位字节与$ r中IP地址的前两个八位字节进行匹配,然后用$ xline返回匹配的$ r路由表IP地址。这将按预期工作,直到不再工作为止。
问题是它可以正常工作,然后突然不再工作,因为即使$ ix,$ e和$ r值仍被填充并且它们的相关代码也可以正常工作,但是$ xline变成空的。尝试几次后,它将再次开始尝试几次,然后停止工作。我不知道我在做什么错,或者这是否是解决问题的正确方法,但我喜欢它的相对简单性。任何帮助,将不胜感激。谢谢。
最佳答案
尝试以下操作(我对代码进行了一些重新格式化,以便更清楚地进行故障排除):
$ix = [System.Net.Dns]::GetHostEntry($env:COMPUTERNAME).AddressList.IPAddressToString;
$e = If ($ix -ne $null) {
$ix | ForEach-Object { ( $_.split('.')[0..1] -join '.') + '.' }
}
$r = Get-NetRoute | Where-Object { $_.AddressFamily -eq 'IPv4' } | Select-Object -ExpandProperty 'DestinationPrefix'
$xline = ForEach ($f in $e) {
$r -match $f
}
$xline
主要变化是将
$line
设置为ForEach
循环中返回的所有值,而不是最后一个。另外,我还删除了不必要的
ForEach-Object
,因为您可以执行它在较早版本中实现的功能。以下是您简短格式的修复程序:
$ix = [System.Net.Dns]::GetHostEntry('<some server with a range of multiple IP addresses here>').AddressList.IPAddressToString;
$e = If ($ix -ne $null) {$ix | % { ($_.split('.')[0..1] -join '.') + '.'} ;
$r = Get-NetRoute | ? AddressFamily -eq 'IPv4' | Select -exp 'DestinationPrefix'; $xline = ForEach ($e in $e) { $r -match $e}; write $xline
关于powershell - Powershell ForEach循环间歇性工作-工作,失败,工作,失败,工作等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48947407/