对CSV使用标准For循环(Import-CSV)

时间:2019-06-18 15:13:42

标签: powershell 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 

任何有关如何实现此目标的想法将不胜感激。

3 个答案:

答案 0 :(得分:1)

在for / foreach循环之外实例化服务器名称变量。每次程序循环时,将新值与旧值进行比较,如果值不同,则重新分配并连接到新服务器。

我还建议按服务器对传入数据进行排序,以便您可以限制重复连接到同一数据源所需的时间。

答案 1 :(得分:1)

如何使用For循环遍历CSV的示例:

$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... 
}

答案 2 :(得分:0)

您可以保留对先前服务器名称和先前连接的引用。 然后使用当前服务器名称检查先前的服务器名称。如果不同,则关闭先前的连接(如果打开了任何连接)。

此外,在foreach循环之后,检查先前的连接是否打开,如果是,则将其关闭。这将是到最后一个服务器的连接。

相关问题