我正在检索具有5个DNS条目的服务器上的hosts文件:
C:\ Windows \ System32下\驱动程序\等\主机
评论后,我的样子如下:
127.0.0.1 infspcpd8tx8e.rtmphost.com
127.0.0.1 infspkbpef39p.rtmphost.com
127.0.0.1 infspo99vn3ti.rtmphost.com
127.0.0.1 infspqx6l10wu.rtmphost.com
127.0.0.1 infspvdkqjhkj.rtmphost.com
在我的主机文件中,我将它们看作是彼此顶部的5行,但是当我将它粘贴在此处时,它之间有一个空格。当我在该文件上使用get-content时,这是相同的,但我不希望这会阻止我。
所以我有一个像这样的数组: $ ACCOUNTS = Get-ChildItem“D:\ cyst \ accounts \”|选择名称
然后我通过检查$ accounts变量来检查主机文件中是否有重复的条目,该变量是针对包含hosts文件的数组。
foreach ($rtmp in $ACCOUNTS) {
$HostsFile = Get-Content C:\Windows\System32\drivers\etc\hosts | ForEach-Object {[System.Convert]::ToString($_)}
#$rt[string]$data = $HostsFile
[string]$rtmpfull = $rtmp.name + ".rtmphost.com"
if ($HostsFile -contains $rtmpfull) { Write-Host "Host found in hosts file moving on..." }
else { echo "wrong"
}
}
它永远不会匹配并且总是返回false,我无法匹配任何东西..请帮忙 - 这是一个类型问题吗?我已经用谷歌搜索了DAYS,但现在我很绝望并在这里发帖。
答案 0 :(得分:2)
我认为你可以通过省略foreach来加快速度。
(Get-Content C:\Windows\System32\drivers\etc\hosts) -match [regex]::escape($rtmpfull)
应该立即匹配整个hosts文件。
答案 1 :(得分:0)
这个测试:
if ($HostsFile -contains $rtmpfull)
正在寻找$ rtmpfull以匹配存储在$ HostsFile中的整行。你想检查像这样的部分匹配;
if ($HostsFile | Foreach {$_ -match $rtmpfull})
BTW你可以简化这个:
$HostsFile = Get-Content C:\Windows\System32\drivers\etc\hosts | ForEach-Object {[System.Convert]::ToString($_)}
为:
$HostsFile = Get-Content C:\Windows\System32\drivers\etc\hosts
默认情况下,Get-Content会为您提供一个字符串数组,其中数组的每个元素都对应于文件中的一行。
答案 2 :(得分:0)
$ACCOUNTS = Get-ChildItem "D:\cyst\accounts\"
foreach ($rtmp in $ACCOUNTS){
$found=$FALSE
foreach ($line in (gc C:\Windows\System32\drivers\etc\hosts)){
if(($line -match $rtmp) -and ($found -eq $TRUE)){
echo "$($matches[0]) is a duplicate"
}
if (($line -match $rtmp) -and ($found -eq $FALSE)){
echo "Found $($matches[0]) in host file..."
$found=$TRUE
}
}
}
不优雅,但它会起作用。