Powershell: попытка сопоставить переменную с массивом с помощью Get-Content - PullRequest
0 голосов
/ 26 января 2012

Я получаю файл hosts на сервере с 5 записями DNS:

C: \ Windows \ System32 \ drivers \ etc \ hosts

Моя копия выглядит так после комментариев:

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

В моем файле hosts я вижу их как 5 строк поверх друг друга, но когда я вставляюэто здесь есть пространство между ними.Это то же самое, когда я использую get-content для этого файла, но я не ожидал, что это остановит меня.

Поэтому у меня есть массив, который получается примерно так: $ ACCOUNTS = Get-ChildItem "D: \ cyst \ account \ "|выберите имя

Затем я пытаюсь выяснить, есть ли дубликаты в файле hosts, проверив переменную $ 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, я не могу ничего сопоставить .., пожалуйста, помогите - это проблема типа?Я гуглил это в течение ДНЕЙ, но теперь я в отчаянии и пишу здесь.

Ответы [ 3 ]

2 голосов
/ 26 января 2012

Я думаю, вы можете ускорить это, просто отказавшись от foreach.

(Get-Content C:\Windows\System32\drivers\etc\hosts) -match [regex]::escape($rtmpfull) 

Должно совпадать со всем файлом hosts одновременно.

0 голосов
/ 28 января 2012
$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
        }
    }
}

Не элегантно, но сработает.

0 голосов
/ 26 января 2012

Этот тест:

if ($HostsFile -contains $rtmpfull)

ищет $ rtmpfull для соответствия всей строке, хранящейся в $ HostsFile. Вы хотите проверить частичное совпадение вот так;

if ($HostsFile | Foreach {$_ -match $rtmpfull})

Кстати, вы можете упростить это:

$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 выдаст вам массив строк, где каждый элемент массива соответствует строке в файле.

...