Получать результаты из таблицы последовательно в foreach? - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть следующий сценарий powershell, который должен выполнять команду процесса для кубов после упорядочения их последовательности в таблице

param($App_input, $Script) #%2 and %3 arguments from cmd line input;

Function Query($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet)
$SqlConnection.Close() 
$DataSet.Tables[0] }

#$cube = Query "SELECT DISTINCT cube_name, sequence FROM [dbo].[$cubeTable] WHERE [application] = '$App_input' ORDER BY [sequence]" | Select -ExpandProperty cube_name;

$Table = Query "SELECT * from [dbo].[$cubeTable]"

                  # -ExpandProperty trims the column name, so it only outputs the value, not with header!

$App = Query "SELECT DISTINCT[application] FROM [dbo].[$cubeTable] WHERE [application] = '$App_input'" | Select -ExpandProperty application;

    $i=0
    $CUBE = @()

    foreach($row in $Table | where { $_.application -match $App })
    {   
        $i++
        $CUBE += $row.Item("cube_name")
        write-host " > CUBE $($i):" $CUBE[$CUBE -1]
        cmd /c "runPowerShell.bat $Script $CUBE"    #where $Script is Process.ps1 script that processes on each CUBE selected from table in order
    }

Это гипотетическая таблица:

Table

например: если бы я должен был передать параметр приложения и параметр сценария как таковой:

someBatchFile.bat SSP Process.ps1

сценарий должен сначала проверить, что цикл возвращает результаты только в том случае, когда столбец [application] = SSP, поэтому в этом случае следует избегать третьей строки.однако, предложение where, которое у меня есть $_.application -match $App, по какой-то причине не имеет никакого эффекта, и powershell возвращает все строки независимо от того, ...

после того, как эта проверка выполнена, сценарий должен упорядочить строки (из 2, 2, 1 к 1, 2, 2) возвращая CUBE2, CUBE1 (только один раз с момента его отличия), который передается на каждой итерации в $CUBE в строке cmd.

по существу, в этих примерах итерации должны выглядеть следующим образом:

cmd / c "runPowerShell.bat $ Process.ps1 CUBE2"

cmd / c"runPowerShell.bat $ Process.ps1 CUBE1"

Я знаю, что order by будет полезен в этом случае, но я не знаю, как я могу использовать это в случае foreach и $row.Item

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Я понял:

Я мог бы просто сделать проверки в $Table

$Table = Query "SELECT * from [dbo].[$cubeTable] WHERE [application] = '$App_input' AND [active] = 'TRUE' ORDER BY [sequence]"

    $i=0
    $CUBE = @()

    foreach($row in $Table)
    {   
        $i++
        $CUBE += $row.Item("cube_name")
        write-host " > CUBE $($i): $($CUBE[-1])`n"
        cmd /c "runPowerShell.bat $Script $($CUBE[-1])" #where $Script is Process.ps1 script that processes on each CUBE selected from table in order
    }
0 голосов
/ 30 сентября 2018

попробуйте

$App = Query "SELECT DISTINCT cube_name FROM [dbo].[$cubeTable] WHERE [application] = '$App_input'"
$i=0

$App | %{

    $i++
    $CUBE=$_.Item("cube_name")
    " > CUBE $i : $CUBE"
    cmd /c "runPowerShell.bat $Script $CUBE"
}
0 голосов
/ 29 сентября 2018

Ваши Query функции возвращают DataTable объект типа, что означает, что $Table переменная тоже DataTable.

Для переменной типа DataTable вы хотите использовать метод Select() для получения отфильтрованных результатов.,Вот так:

$Table.Select("application = '$App'")

Тоже.Посмотрите весь ваш код, для меня это выглядит странно.

param($App_input, $Script)

$App = Query "SELECT DISTINCT[application] FROM [dbo].[$cubeTable] WHERE [application] = '$App_input'" | Select -ExpandProperty application;

Вы передаете $ application в сценарий для следующей передачи его для запроса, который должен вернуть значение application из таблицы базы данных, пока условие фильтра этого запроса равно приложение значение.

Вы можете просто использовать приложение значение уже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...