Скрипты Powershell работают при непосредственном запуске, но не при вызове другим - PullRequest
0 голосов
/ 11 декабря 2019

У меня длинный список простых заданий, которые я бы хотел несколько автоматизировать. Это простые вещи, захватывать или публиковать информацию через API и создавать некоторые отчеты, ничего особенного.

Я решил создать мастер-сценарий, который ориентирован на множество других сценариев, каждый из которых выполняет свою работу. Каждый из этих маленьких скриптов, справочные функции из скрипта Utility , который я создал, имеет функции, которые являются общими для всех других простых скриптов работы.

Каждый из скриптов отлично работает, когда язапустить их напрямую, однако, когда я пытаюсь запустить их через мастер-скрипт, который направляет их, они все терпят неудачу.

Одним из примеров является то, что во многих случаях мне нужно извлекать данные из API, но ограничивается 1000 возвращаемыми объектами, когда мне нужно 10k +. Чтобы решить эту проблему, я построил функцию, которая рекурсивно вызывает себя, пока не осталось больше данных для сбора. Опять же, это работает, когда вызывается само по себе, но не из основного сценария, по какой-то причине, оно выручает после первого запуска (в этом случае должно выполняться более 10 раз). Тогда ничего не возвращается.

Я думаю, может быть, это как-то связано с тем, как я определяю функции / переменные ?? Точно сказать не могу. Я попытался определить область до Global, Local & Script, но, похоже, никто не работает. Вот часть кода ...

*Master Director Script runs script based on user input*

...

&$choice_hash[$action].script_path
$ScriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. "$ScriptDirectory\Utilities.psm1"

$user_data          = $null
$env_choice         = $null
$csv_output_path    = $null
$collated_user_data = [System.Collections.ArrayList]@()

function selectEnv {
    $global:env_choice = Read-Host @"
    > Select an Environment: [Prod] or [Dev]

    Your Choice
"@
    if ($env_choice -ne 'Prod' -and $env_choice -ne 'Dev') {
        consoleCmt $env_choice
        consoleCmt 'Invalid Choice. Try again...'
        selectEnv
    } else {
        if ($env_choice -eq 'Prod') {
            $global:csv_output_path = '\\etoprod\******\Exports\Report_Users_Prod.csv'  
        } else {
            $global:csv_output_path = '\\etoprod\******\Exports\Report_Users_Dev.csv'
        }

        $global:user_data = process_data $env_choice 'api/xm/1/people?embed=roles&limit=1000'
    }
}

function processUsersData {
     foreach($user in $user_data) {
        $user_roles     = ''
        $role_divider   = ','

        for($i = 0; $i -lt $user.roles.data.length; $i++) {
            # Only append a comma if there are more, otherwise leave blank for CSV deliniation 
            if ($i -eq $user.roles.data.length - 1) {
                $role_divider = ''
            }

            $user_roles += $user.roles.data[$i].name + $role_divider
        }

        # Build ordered hash table with above data
        $sanatized_user = [pscustomobject][ordered]@{id = $user.targetName; firstName = $user.firstName; lastName = $user.lastName; siteName = $user.site.name; roles = $user_roles }

        # Shovel into storage array used for building the CSV
        $global:collated_user_data += $sanatized_user
    }
}

notice 'Initiating Groups Report Script'
selectEnv
processUsersData
exportCsv $collated_user_data $csv_output_path

Сценарий утилит (при вызове соответствующих функций)

     $res      = $null
        $content  = @()

...

    function process_data($env, $url) {
            fetch_data $env $url

            foreach($i in $res.data) {
                $global:content += $i
            }

            if($res.links.next) {
                fetch_more $env $res.links.next
            }

            return $content  **Should return full collection of data, but fails after one pass**
        }

        function fetch_data($env, $url) {
            $base = generateEnvBase $env
            $path = "$base/$url"

            $req        = Invoke-WebRequest -Credential $cred -Uri $path -Method GET
            $global:res = ConvertFrom-Json $req
        }

        function fetch_more($env, $url) {
            $base = generateEnvBase $env
            $path = "$base$url"

            $req  = Invoke-WebRequest -Credential $cred -Uri $path -Method GET
            $res  = ConvertFrom-Json $req

            foreach($i in $res.data) {
                $global:content += $i
            }

            if($res.links.next) {
                fetch_more $env $res.links.next 
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...