2016-01-26 1 views
1

У меня есть этот кусок кода:Чтение из CSV производит повторяющиеся записи в переменной

$servers = Import-Csv "sources.csv" 
$computername = $servers.server 
$ServiceName = $servers.services 

sources.csv содержит следующие ..

Server,Services 
BRWS40,winrm 
BRWS84,winrm

У меня тогда в foreach и Write-Host находится в том, что , он выводит это:

Write-Host "$computername - $ServiceName" -ForegroundColor black -BackgroundColor red 

Выход сверху я получаю:

BRWS40 BRWS84 - winrm winrm

Принимая во внимание, что я хотел иметь один компьютер и услугу в каждой строке.

Что я делаю неправильно?

Введен код с here.

ответ

1

Вы на самом деле нужно перебрать ваш результат:

$servers = Import-Csv "sources.csv" 

$servers | %{ 
    $computername = $_.server 
    $ServiceName = $_.services 

    write-host "$computername - $ServiceName" -foregroundcolor black -backgroundcolor red 
} 

или используйте Format-Table Командлет:

$servers | Format-Table 
+0

Спасибо за оба ваши ответа, теперь я могу исправить это и закончить свой сценарий. Я видел сервер $ _., Который использовался ранее, но просто не понял, как он использовался. Теперь я лучше понимаю это. Я занимаюсь созданием скрипта, который будет запускать и проверять различные службы на разных компьютерах. , используя заимствованный код с нескольких сайтов, этот сайт действительно очень помогает. Еще раз спасибо, это очень ценится. , – yardyy

2

$servers = Import-Csv "sources.csv" импортирует содержание sources.csv в виде списка пользовательских объектов в переменную $servers.

$computername = $servers.server выбирает значение свойства server каждого объекта в переменной $computername, тем самым генерируя список имен компьютеров.

$ServiceName = $servers.services выбирает значение свойства services каждого объекта в переменной $ServiceName, создавая таким образом список имен служб.

Обратите внимание, что $array.property будет работать только в PowerShell v3 и новее, поскольку более ранние версии не автоматически разворачивают массив, чтобы получить свойства элемента, но попытайтесь получить доступ к свойству самого объекта массива. Если массив не обладает таким свойством, результатом будет $null, иначе это будет значение свойства массива. В любом случае это не то, что вы хотите. Для того, чтобы сделать работу расширения собственности через все версии PowerShell используют Select-Object -Expand или эхо собственности в ForEach-Object заявления:

$computername = $servers | Select-Object -Expand server 
$computername = $servers | ForEach-Object { $_.server } 

Когда вы кладете массив переменные в строке ("$computername - $ServiceName") элементы массива присоединяются к $OFS (пробел по умолчанию), поэтому "$computername" становится BRWS40 BRWS84 и "$ServiceName" становится winrm winrm.

Чтобы получить соответствующее имя службы для каждого компьютера, необходимо обработать $servers в цикле, например:

foreach ($server in $servers) { 
    Write-Host ('{0} - {1}' -f $server.Server, $server.Services) ... 
} 

Если вам не нужен конкретный формат вывода можно также использовать один из Format-* командлеты, например Format-Table:

Import-Csv "sources.csv" | Format-Table -AutoSize 
Смежные вопросы