Использование нормали для цикла с CSV (Import-CSV) - PullRequest
0 голосов
/ 18 июня 2019

Я работаю над сценарием PowerShell, который будет импортировать файл CSV, содержащий информацию о сервере (включая имя сервера, экземпляр, состояние и имена баз данных), с помощью командлета Import_Csv. После импорта файла сценарий перебирает файл, подключается к каждому серверу / экземпляру и добавляет пользователя в каждую базу данных.

Я пытаюсь понять, как можно использовать обычный цикл FOR в скрипте вместо цикла FOREACH. Я хочу ограничить количество подключений к каждому серверу, просматривая список серверов / баз данных. Я хочу проверить, совпадает ли текущий сервер / экземпляр со следующим сервером / экземпляром в файле, оставьте соединение открытым. Например, если у меня есть следующие данные в файле:

server1,instance1,online,database1
server1,instance1,online,database2
server2,instance1,online,database1
server2,instance1,online,database2

Когда я смотрю данные в первой строке, перед закрытием соединения с сервером1 \ instance1 я хочу проверить, находятся ли те же данные во второй строке, чтобы мне не нужно было закрывать текущее соединение, а затем через минуту подключитесь к тому же серверу.

У меня вопрос, есть ли способ получить доступ к следующему элементу файла CSV в PowerShell в цикле FOREACH, или я должен использовать цикл FOR? Если вместо этого я использую цикл FOR, что лучший способ получить доступ к каждому полю?

Вот то, что я сейчас имею с комментариями в цикле foreach того, что я хотел бы, чтобы произошло:

Param(
    [Parameter(Mandatory=$true,position=0)]
    [string]$serverListFilePath = $( Read-Host "Server List File Path: " )
)

Write-Host "File path: $serverListFilePath"
$serverListArray = Import-Csv -Path $serverListFilePath # Import the server list CSV file and store it into a CSV object
#$serverListArray

foreach ($item in $serverListArray) # Basically all the substance/work of this script is going to be done in this loop since it needs to go through each server in the file one-by-one
{
    Try
    {
        $serverNameCSV = $item.server_Name
        $serverInstanceCSV = $item.Server_Instance
        $serverStatusCSV = $item.Server_Status
        $databaseNameCSV = $item.Database_Name


        # If no connection to server
             # Create connection to server/instance
        # Run SQL queries
        # If (<current server\instance> -ne <next server\instance>)
             # Close connection to server/instance
             # continue
        # else
             # continue


    } # End Try
# Catch 

Любые идеи о том, как это сделать, будут высоко оценены.

Ответы [ 3 ]

1 голос
/ 18 июня 2019

Пример того, как пройти через CSV с помощью цикла For:

$serverListArray = Import-Csv -Path $serverListFilePath
#will loop until $x is no longer less than 10
for ($x=0;$x -lt 10; $x++)
{
    #call property by index
    $serverListArray[$x].Server_name
    $serverListArray[$x].Server_instance
    #etc... 
}
1 голос
/ 18 июня 2019

Создание переменной имени сервера вне цикла for / foreach. Каждый раз, когда ваша программа зацикливается, сравнивайте новое значение со старым значением и, если значения отличаются, переназначайте и подключайтесь к новому серверу.

Я бы также посоветовал отсортировать входящие данные по серверу, чтобы вы могли ограничить количество раз, которое вам необходимо повторно подключать к одному и тому же источнику данных.

0 голосов
/ 18 июня 2019

Вы можете сохранить ссылку на предыдущее имя сервера и предыдущее соединение.Затем проверьте предыдущее имя сервера с текущим именем сервера.Если он отличается, закройте предыдущее соединение (если что-то открыто).

Кроме того, после цикла foreach проверьте, открыто ли предыдущее соединение, если да, закройте его.Это будет соединение с последним сервером.

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