Powershell:Foreach cmdlet 用最后一项的结果覆盖数据集
Powershell: Foreach cmdlet overwriting dataset with results of last item
我的输出,将始终包含来自第二项(数据库)的信息,似乎它正在覆盖为初始项返回的任何值?我可以更改项目的顺序来证明这一点。请帮忙...
$databaselist = Get-Content D:\AdvancedDB\Server2.txt
$servername = get-content D:\AdvancedDB\Server.txt
$dataSource = $servername
$myuserID = 'userid'
$mypassword = 'password'
$DatabaseIndexInfo =
"SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID()
ORDER BY indexstats.avg_fragmentation_in_percent desc"
$connectionDetails = "Provider=sqloledb; " + "Server=$dataSource; " + "Database=$database; " +
"User
ID=$myuserID; " + " Password=$mypassword; "
$frag16 = @()
foreach ($database in $databaselist) {
##Connect to the data source using the connection details and T-SQL command we provided above, and
open the connection
$connection = New-Object System.Data.OleDb.OleDbConnection $connectionDetails
$command16 = New-Object System.Data.OleDb.OleDbCommand $DatabaseIndexInfo,$connection
$connection.Open()
##Get the results of our command into a DataSet object, and close the connection
$dataAdapter = New-Object System.Data.OleDb.OleDbDataAdapter $command16
$dataSet16 = New-Object System.Data.DataSet
$dataAdapter.Fill($dataSet16)
$connection.Close()
}
$frag16 += $dataset16.Tables | Out-File 'd:\advanceddb\test5.txt'
您需要在 foreach 循环中移动您的连接详细信息。如果您需要使用不同的数据库,那么您还需要更新您的连接字符串。
foreach ($database in $databaselist) {
$connectionDetails = "Provider=sqloledb; " + "Server=$dataSource; " + "Database=$database; " +
"User ID=$myuserID; " + " Password=$mypassword; "
...
由于 connectionDetails 未在您的循环中更新,因此您会看到相同的数据。
我的输出,将始终包含来自第二项(数据库)的信息,似乎它正在覆盖为初始项返回的任何值?我可以更改项目的顺序来证明这一点。请帮忙...
$databaselist = Get-Content D:\AdvancedDB\Server2.txt
$servername = get-content D:\AdvancedDB\Server.txt
$dataSource = $servername
$myuserID = 'userid'
$mypassword = 'password'
$DatabaseIndexInfo =
"SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID()
ORDER BY indexstats.avg_fragmentation_in_percent desc"
$connectionDetails = "Provider=sqloledb; " + "Server=$dataSource; " + "Database=$database; " +
"User
ID=$myuserID; " + " Password=$mypassword; "
$frag16 = @()
foreach ($database in $databaselist) {
##Connect to the data source using the connection details and T-SQL command we provided above, and
open the connection
$connection = New-Object System.Data.OleDb.OleDbConnection $connectionDetails
$command16 = New-Object System.Data.OleDb.OleDbCommand $DatabaseIndexInfo,$connection
$connection.Open()
##Get the results of our command into a DataSet object, and close the connection
$dataAdapter = New-Object System.Data.OleDb.OleDbDataAdapter $command16
$dataSet16 = New-Object System.Data.DataSet
$dataAdapter.Fill($dataSet16)
$connection.Close()
}
$frag16 += $dataset16.Tables | Out-File 'd:\advanceddb\test5.txt'
您需要在 foreach 循环中移动您的连接详细信息。如果您需要使用不同的数据库,那么您还需要更新您的连接字符串。
foreach ($database in $databaselist) {
$connectionDetails = "Provider=sqloledb; " + "Server=$dataSource; " + "Database=$database; " +
"User ID=$myuserID; " + " Password=$mypassword; "
...
由于 connectionDetails 未在您的循环中更新,因此您会看到相同的数据。