遍历数据库数组以对数据库运行SQL查询

时间:2019-03-12 10:36:58

标签: powershell

我正在尝试对多个数据库运行相同的SQL查询,并将结果输出到每个数据库的单独的文本文件中。到目前为止,我在做的事情与输出文件名有关。当我将文件名修改为仅使用C:\TEMP\usersoutput_$Num.txt时,它将所有内容放入一个文件中。这是我的代码:

$DBArray = @("DataBase1","DataBase2","DataBase3","DataBase4","DataBase5")
$Num = 0

foreach ($element in $DBArray) {
    (Invoke-Sqlcmd -Query "...." -ServerInstance Server2 -Database $DBArray[$Num] -Verbose
    ) *>> C:\TEMP\usersoutput_$DBArray[$Num].txt |
    foreach {$Num = $Num + 1}
}

我在哪里错了?这是完成此任务的最好方法吗?

2 个答案:

答案 0 :(得分:2)

为使PowerShell正确解析比字符串内的变量名称更复杂的内容,请将表达式放在$()中:

C:\TEMP\usersoutput_$($DBArray[$Num]).txt

但是,由于您已经在使用foreach循环,因此不需要$Num索引变量:

foreach ($db in $DBArray) {
    Invoke-Sqlcmd -Query "...." -ServerInstance "Server2" -Database $db -Verbose |
    Out-File "C:\TEMP\usersoutput_$db.txt"
}

或:

"DataBase1","DataBase2","DataBase3","DataBase4","DataBase5" | foreach {
    Invoke-Sqlcmd -Query "...." -ServerInstance "Server2" -Database $_ -Verbose |
    Out-File "C:\TEMP\usersoutput_$_.txt"
}

答案 1 :(得分:2)

  1. 如果您已经在使用foreach循环,则无需使用增量计数器。
  2. 如果您使用的是foreach循环,则需要使用变量$element而非$DBArray访问循环中的元素。
  3. 使用$($element)evaluate the expression inside the variable

以下将为您工作-

$DBArray = @("DataBase1","DataBase2","DataBase3","DataBase4","DataBase5")
foreach ($element in $DBArray)
{
    (Invoke-Sqlcmd -Query "...." -ServerInstance Server2 -Database $element -Verbose) *>> C:\TEMP\usersoutput_$($element).txt
}