Powershell 将普通For循环与CSV一起使用(导入CSV)

Powershell 将普通For循环与CSV一起使用(导入CSV),powershell,csv,Powershell,Csv,我正在编写一个PowerShell脚本,该脚本将使用import_CSV cmdlet导入包含服务器信息(包括服务器名称、实例、状态和数据库名称)的CSV文件。导入文件后,脚本将在文件中循环,连接到每个服务器/实例,并向每个数据库添加一个用户 我想弄明白的是如何在脚本中使用普通FOR循环而不是FOREACH循环。我想通过在服务器/数据库列表中循环来限制连接到每台服务器的次数。我要检查的是,如果当前服务器/实例与文件中的下一个服务器/实例相同,请保持连接打开。例如,如果文件中有以下数据: serv

我正在编写一个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(
[参数(必需=$true,位置=0)]
[string]$serverListFilePath=$(读取主机“服务器列表文件路径:”)
)
写入主机“文件路径:$serverListFilePath”
$serverListArray=Import Csv-Path$serverListFilePath#导入服务器列表Csv文件并将其存储到Csv对象中
#$serverListArray
foreach($serverListArray中的item)#基本上这个脚本的所有内容/工作都将在这个循环中完成,因为它需要逐个遍历文件中的每个服务器
{
尝试
{
$serverNameCSV=$item.server\u名称
$serverInstanceCSV=$item.Server\u实例
$serverStatusCSV=$item.Server\u状态
$databaseNameCSV=$item.Database\u Name
#如果没有连接到服务器
#创建到服务器/实例的连接
#运行SQL查询
#如果(-ne)
#关闭与服务器/实例的连接
#继续
#否则
#继续
}#结束尝试
#抓住

任何关于如何实现这一点的想法都将不胜感激。

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


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

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

如何使用
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
循环后,请检查上一个连接是否打开,如果打开,请将其关闭。这将是到最后一个服务器的连接。

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


另外,在
foreach
循环后,检查上一个连接是否打开,如果是,请关闭它。这将是到最后一个服务器的连接。

谢谢。我将尝试这里介绍的两种解决方案,但我很高兴我终于可以看到使用常规
for
循环与CSV的语法。经过一点搜索,我发现因为只有使用标准的
Foreach
方法才能获得结果。@E.Kelly很好。如果您需要更多的说明。或者,进一步的帮助,请让我知道。谢谢。我将尝试这里介绍的两种解决方案,但我很高兴我终于可以看到使用CSV的正常
for
循环的语法。经过一点搜索,我只使用标准的
Foreach
方法获得结果。@E.Kelly很好。如果您需要更多的说明。或者,进一步的帮助,请让我知道。您是否想过使用
Group Object
对连接进行分组?这将允许您通过一次调用处理对同一系统的所有访问。您想过使用
Group-O吗bject
对连接进行分组?这将允许您通过一次调用处理对同一系统的所有访问。