【问题标题】:Iterate through array of variables passing each one to a function in PowerShell遍历变量数组,将每个变量传递给 PowerShell 中的函数
【发布时间】:2020-03-10 08:17:39
【问题描述】:

我有一个将 SQL 查询结果导出到 json 文件的函数:

# Connect to SQL Server
$SqlCommand.CommandText = $Query;
$SqlCommand.Connection = $SqlConnection;

# Execute query and get the result back
$QueryResult = $SqlCommand.ExecuteReader()

# Hold query result in data table
$QueryTable = New-Object "System.Data.DataTable"
$QueryTable.Load($QueryResult)

# Export query results to json
$QueryTable | Select-Object $QueryTable.Columns.ColumnName | ConvertTo-Json | Out-File "$OutputDirectory\$SqlInstance-$QueryName.json"

我有多个要执行的查询,并为每个查询创建了变量:

$q1 = "SELECT blah"
$q2 = "SELECT more blah"
$q3 = "SELECT even more blah"

我通过以下方式调用函数:

ExportQueryResultsToJson -Query $q1 -QueryName "q1"

我有大约 80 个查询要执行,所以我想使用 ForEach 而不是 80 行 ExportQueryResultsToJson ...。我创建了一个变量数组:

$SqlServer2012QueryArray = @(
    $q1,
    $q2,
    $q3
)

我尝试了以下多种变体:

foreach ($Query in $SqlServer2012QueryArray) {
    $Expression = "ExportQueryResultsToJson -Query '$Query' -QueryName $Query"
    Invoke-Expression $Expresion
}

我尝试过使用 splat,但我不知道如何正确传递所有查询。

我做错了什么?

【问题讨论】:

    标签: sql-server function powershell foreach


    【解决方案1】:

    您可以通过多种方式解决此问题。以下是三种可能的方式,它们在算法上都非常相似:


    使用你的数组:

    解决方案取决于您的数组$sqlserver2012QueryArray 具有q<number> 格式的按顺序编号的变量列表。第一个变量名必须是q1

    for ($i = 0; $i -lt $sqlserver2012QueryArray.Count; $i++) {
        ExportQueryResultsToJson -Query $sqlserver2012QueryArray[$i] -QueryName $((Get-Variable "q$($i+1)").Name)
    }
    

    查询已经创建的变量:

    此解决方案依赖于以q<number> 格式命名的变量。它们不必按顺序命名。如果它们被命名为q<number>abc,它可能会捕获不需要的变量。

    foreach ($var in (Get-Variable -Name q[0-9]*)) {
        ExportQueryResultsToJson -Query $var.Value -QueryName $var.Name
    }
    

    使用哈希表:

    您可以创建一个哈希表,其中每个键名是您的变量名,关联的值是查询字符串。您只需输入查询字符串作为值即可绕过使用此解决方案创建查询变量。

    $queryhash = @{'q1' = $q1; 'q2' = $q2; 'q3' = $q3; 'q14' = $q14}
    foreach ($var in $queryhash.GetEnumerator()) {
        ExportQueryResultsToJson -Query $var.Value -QueryName $var.Key
    }
    

    注意:在所有情况下,您都应尽量避免使用Invoke-Expression。它通常不是一个安全的命令,因为它欢迎代码注入。我也不明白为什么在这种情况下也有必要。

    【讨论】:

    • 你太棒了,谢谢。我选择了哈希表选项。
    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 2020-07-28
    • 1970-01-01
    • 2016-09-09
    • 2017-09-12
    • 2017-09-22
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多