我正在尝试对多个数据库运行相同的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}
}
我在哪里错了?这是完成此任务的最好方法吗?
答案 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)
foreach
循环,则无需使用增量计数器。foreach
循环,则需要使用变量$element
而非$DBArray
访问循环中的元素。$($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
}