繁体   English   中英

结合使用普通For循环和CSV(Import-CSV)

[英]Using a Normal For Loop with CSV (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 

任何有关如何做到这一点的想法将不胜感激。

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

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

如何使用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... 
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM