Powershell:Foreach cmdlet覆盖具有最后一项结果的数据集

问题描述 投票:0回答:1

我的输出,将始终包含第二个项目(数据库)中的信息,似乎它正在覆盖为初始项目返回的任何值?我可以更改项目的顺序以证明这一点。请帮助...

    $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' 
powershell foreach overwrite
1个回答
0
投票

我建议您在$ eacheach循环内移动$ frag16 + =语句。每次循环遍历$ dataset16时,它都会创建一个新变量,并丢弃在上一次迭代中创建的任何内容。

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


$frag16 | Out-File 'd:\advanceddb\test5.txt' 
© www.soinside.com 2019 - 2024. All rights reserved.