首页 > 解决方案 > 使用带有 CSV 的普通 For 循环 (Import-CSV)

问题描述

我正在编写一个 PowerShell 脚本,该脚本将使用 Import_Csv cmdlet 导入包含服务器信息(包括服务器名称、实例、状态和数据库名称)的 CSV 文件。导入文件后,脚本将遍历文件,连接到每个服务器/实例,并为每个数据库添加一个用户。

我想弄清楚的是如何能够在脚本中使用普通的 FOR 循环而不是 FOREACH 循环。我想通过遍历服务器/数据库列表来限制我必须连接到每个服务器的次数。我要检查的是当前服务器/实例是否与文件中的下一个服务器/实例相同,保持连接打开。例如,如果我在文件中有以下数据:

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

当我查看第一行的数据时,在关闭与 server1\instance1 的连接之前,我想检查第二行是否有相同的数据,这样我就不必关闭当前连接然后重新连接到稍后同一服务器。

我的问题是,有没有办法在 FOREACH 循环中访问 PowerShell 中 CSV 文件的下一个元素,还是应该使用 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 

任何关于如何解决这个问题的想法都将不胜感激。

标签: powershellcsv

解决方案


如何使用循环遍历 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... 
}

推荐阅读