1

複数のサーバーとデータベースに対してクエリを実行する PowerShell スクリプトに取り組んでいます。サーバーとデータベースをアレイに動的に追加して実行するという考えです。

現在、すべてが組み合わされた最後の部分で立ち往生しています。サーバーは追加できますが、データベースは追加できません。

私が達成しようとしているもの: MFP GUI を使用して PowerShell スクリプトを実行し、複数の MSSQL サーバーに対してクエリを実行します。これらのサーバーにはすべて同一のデータベース (データが異なる) が含まれていますが、データベースの名前Sql_Data-Node1は 、SqlData-Node2などと異なります。

私が遭遇した問題: サーバーをアレイに動的に追加することができ、クエリを実行すると適切な応答が得られます。この場合、マスター データベースを使用し、静的 ( -database 'master') にしました。データベースで同じことをしようとすると (配列に追加する)、エラーが発生します。

Invoke-Sqlcmd : Cannot validate argument on parameter 'Database'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
At C:\Users\master\Documents\MULTSCRIPT\MultiQueryV0.6.ps1:368 char:109
+ ... ame -Password $PassWord -ServerInstance $_[0] -Database $_[1] -Query  ...
+                                                             ~~~~~
+ CategoryInfo          : InvalidData: (:) [Invoke-Sqlcmd], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

私のコード:

#Create EMPTY ARRAY for Databases
$script:DBSet = New-Object System.Collections.ArrayList 

    #==========================================================================

    $window.Master.add_Checked({
        $script:Master = 'master' #Add IP to Variable
        $script:DBSet.Add("$script:Master") #Add Variable to Array
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    $window.Master.add_Unchecked({
        $script:Master = $null
        $script:DBSet.Remove("$script:Master")
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    #==========================================================================

    $window.DataNodes.add_Checked({
        $script:DB01 = 'Database01'                                                  
        $script:DBSet.Add("$script:DB01")
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    $window.DataNodes.add_Unchecked({
        $script:DB01 = $null
        $script:DBSet.Remove("$script:DB01")
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    #Create EMPTY ARRAY For Servers
    $script:ServerAddress = New-Object System.Collections.ArrayList

    #Add action to Checkbox====================================================

    $window.DB00.add_Checked({
        $script:SRV00 = '190.168.1.8' #Add IP to Variable
        $script:ServerAddress.Add("$script:SRV00") #Add Variable to Array
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    $window.DB00.add_Unchecked({
        $script:SRV00 = $null
        $script:ServerAddress.Remove("$script:SRV00") #Remove Variable to Array 
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    #==========================================================================

    $window.DB01.add_Checked({
        $script:SRV01 = '192.168.1.9'
        $script:ServerAddress.Add("$script:SRV01")
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    $window.DB01.add_Unchecked({
        $script:SRV01 = $null
        $script:ServerAddress.Remove("$script:SRV01")
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })

    #Collect Credentials#======================================================

    $credential = Get-Credential 
    $UserName = $credential.UserName.Replace('\','')
    $PassWord = $credential.GetNetworkCredential().password


    #Collect From Input Fields#================================================

    $window.Button.add_Click({
        $SQLQuery = $window.Query.Text.ToString()
        $Server = $script:ServerAddress
        $DatabaseSet = $script:DBSet
        $instances = @( @($Server, $DatabaseSet) )
        $instances | ForEach{
            Invoke-Sqlcmd -AbortOnError `
                -Username $UserName`
                -Password $PassWord`
                -ServerInstance $_[0]`
                -Database $_[1]`
                -Query $SQLQuery`
                -QueryTimeout 30 |
                Out-GridView -Title $_[0]
        }
        [System.Object]$sender = $args[0]
        [System.Windows.RoutedEventArgs]$e = $args[1]
    })
4

1 に答える 1

1

次の解決策が機能するようです。クレジットは次のとおりです: Foreach ループの複数の変数 [Powershell]

$window.Button.add_Click(
{   $DataBase = $window.DataBase.Text.ToString()
    $SQLQuery = $window.Query.Text.ToString()
    $Server = $ServerAddress.getenumerator()
    $Database = $DBSet.getenumerator()
    while($Server.MoveNext() -and $Database.MoveNext()){
    Invoke-Sqlcmd -AbortOnError -Username $UserName -Password $PassWord -ServerInstance $Server.Current -Database $Database.Current -Query $SQLQuery -QueryTimeout 30 | Out-GridView -Title $Server.Current}
于 2015-11-22T21:44:40.363 に答える