【问题标题】:How to store results from column in for loop variable as array如何将for循环变量中列的结果存储为数组
【发布时间】:2018-09-18 22:12:10
【问题描述】:

我在一个表中有一些行,其中有一列名为“query_server”。

Invoke_ASCmd 命令必须在不同的查询服务器(称为 Destination_server)上调用两次(2 行),如下所示:

    foreach($row in $Table | where { $_.cube_name -match $CUBE -and $_.active -match $Active })
{
    $Destination_Server = $row.Item("query_server")
    $sync_output += "_$Destination_Server.txt"
    Invoke-ASCmd –InputFile $XML_file -Server $Destination_Server >$sync_output

}

我试过这样做,但它不起作用

$i=0
foreach($row in $Table | where { $_.cube_name -match $CUBE -and $_.active -match $Active })
{
    @($Destination_Server) = $row.Item("query_server")
    $sync_output += "_$Destination_Server.txt"
    Invoke-ASCmd –InputFile $XML_file -Server $Destination_Server[$i] >$sync_output
    $i++
}

抛出错误:

  • @($Destination_Server) = $row.Item("query_server")
  • ~~~~~~~~~~~~~~~~~~~~~~~~~ 赋值表达式无效。赋值运算符的输入必须是能够接受的对象 赋值,例如变量或属性。
    • CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    • FullyQualifiedErrorId : InvalidLeftHandSide

【问题讨论】:

    标签: sql-server powershell


    【解决方案1】:

    数组必须在 foreach 循环之外进行初始化。否则,它仅在循环的单个实例中可用。

    试试这个:

    $i=0
    $Destination_Server = @()
    foreach($row in $Table | where { $_.cube_name -match $CUBE -and $_.active -match $Active })
    {
        $Destination_Server += $row.Item("query_server")
        $sync_output += "_$Destination_Server.txt"
        Invoke-ASCmd –InputFile $XML_file -Server $Destination_Server[$Destination_Server.length -1] >$sync_output
        $i++
    }
    

    【讨论】:

    • 顺便说一句,我注意到有拼写错误,它的长度不长哈哈。但即使在修复之后,我也收到错误“Invoke-ASCmd:无法建立连接。确保服务器正在运行。”。这意味着目标服务器不正确。它要么无效,要么不明白它试图得到什么。另外,如果使用这个“$Destination_Server.length -1”,保持增量 i 有什么意义?
    • 感谢您的提及。我已经把错字编辑掉了。你是对的,保留 $i 是没有意义的。我刚刚对您的脚本进行了最小的更改,以使其成为正确的数组。只需在 Invoke-ASCmd 之前打印出 $Destination_Server[$Destination_Server.length -1] 即可查看其中存储的值。
    • 所以我改为这样做了...$Destination_Server[$i] >$sync_output 并且它运行成功...但我认为输出只是获得第一个 query_server,因为输出文件显示一个带有 query_server1 的文件和另一个带有 query_server1query_server1 的文件。成功运行将输出一个带有 query_server1 的文件和另一个带有 query_server2 作为名称的输出文件
    • 等待...所以我尝试打印出你所说的内容,它实际上打印出两个查询服务器!酷...所以我把它放回括号而不是 $i,我看到输出文件 1 被命名为查询服务器 1,这很好。但是第二个输出文件出于某种原因抓取了相同的文件(我认为)并将其命名为“query_server1_query_server1query_server2”。它应该只是一个文件 query_server1 和另一个文件 query_server2
    • 看起来$row.Item("query_server") 有问题
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多