我正在处理一个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
任何有关如何实现此目标的想法将不胜感激。
答案 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
循环之后,检查先前的连接是否打开,如果是,则将其关闭。这将是到最后一个服务器的连接。