Почему это не правильно считать |PowerShell - PullRequest
0 голосов
/ 11 июня 2018

Сейчас у меня есть CSV-файл, который содержит более 3800 записей.Этот файл содержит список имен серверов, за которым следует аббревиатура, указывающая, является ли сервер сервером Windows, сервером Linux и т. Д. Файл также содержит комментарии или документацию, где каждая строка начинается с «#», указывая, что это комментарий.Пока что у меня есть следующее:

$file = Get-Content .\allsystems.csv
$arraysplit = @()
$arrayfinal = @()
[int]$windows = 0

foreach ($thing in $file){
    if ($thing.StartsWith("#")) {
        continue
        }
    else {
        $arraysplit = $thing.Split(":")
        $arrayfinal = @($arraysplit[0], $arraysplit[1])
    }
}

foreach ($item in $arrayfinal){
    if ($item[1] -contains 'NT'){
        $windows++
    }
    else {
        continue
    }
}
$windows

Цель этого скрипта - подсчитать общее количество серверов Windows.Моя проблема в том, что первый блок «foreach» работает нормально, но второй приводит к тому, что «$ Windows» равно 0. Я честно не уверен, почему это не работает.Вот два примера строк данных:

example:LNX

example2:NT

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

Цель этого сценария - подсчитать общее количество серверов Windows.

Я бы предложил простой способ: использовать встроенные для этого командлеты.

$csv = Get-Content -Path .\file.csv |
    Where-Object { -not $_.StartsWith('#') } |
    ConvertFrom-Csv

@($csv.servertype).Where({ $_.Equals('NT') }).Count

# Compatibility mode:
# ($csv.servertype | Where-Object { $_.Equals('NT') }).Count

Замените servertype и 'NT' на то, что называется заголовком / значением.

0 голосов
/ 12 июня 2018

Я бы не стал делать еще один цикл ForEach для увеличения числа вхождений.Ваш $ arrayfinal также переписывает каждый раз, поэтому я использовал ArrayList.

$file = Get-Content "E:\Code\PS\myPS\2018\Jun\12\allSystems.csv"
$arrayFinal = New-Object System.Collections.ArrayList($null)

foreach ($thing in $file){
    if ($thing.StartsWith("#")) {
        continue
        }
    else {
        $arraysplit = $thing -split ":"
        if($arraysplit[1] -match "NT" -or $arraysplit[1] -match "Windows")
        {
            $arrayfinal.Add($arraysplit[1]) | Out-Null
        }
    }
}

Write-Host "Entries with 'NT' or 'Windows' $($arrayFinal.Count)"

Я не уверен, хотите ли вы сохранить 'Example', 'example2' ... поэтому я пропустил добавление их в arrayfinal, предполагая, что целью является подсчет «NT» или «Windows»."вхождения

0 голосов
/ 12 июня 2018

если целью является подсчет серверов Windows, зачем вам массив?

вы не можете просто сказать что-то вроде

foreach ($thing in $file)
{
    if ($thing -notmatch "^#" -and $thing -match "NT") { $windows++ }
}
0 голосов
/ 12 июня 2018
$arrayfinal = @($arraysplit[0], $arraysplit[1])

Этот массив заменяется при каждом запуске.

Изменение его на += вызвало еще одну проблему.Он просто добавлял каждый отдельный элемент.Я использовал информацию этого поста, чтобы исправить это, вроде форсирования 2d массива: Как создать массив массивов в powershell? .

$file = Get-Content .\allsystems.csv
$arraysplit = @()
$arrayfinal = @()
[int]$windows = 0

foreach ($thing in $file){
    if ($thing.StartsWith("#")) {
        continue
        }
    else {
        $arraysplit = $thing.Split(":")
        $arrayfinal += ,$arraysplit
    }
}

foreach ($item in $arrayfinal){
    if ($item[1] -contains 'NT'){
        $windows++
    }
    else {
        continue
    }
}
$windows

1

Я также изменил файл и добавил больше экземпляров NT и другого случайного мусора.Кажется, все работает отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...