Function Powershell脚本在直接运行时工作,但在被另一方调用时不工作

Function Powershell脚本在直接运行时工作,但在被另一方调用时不工作,function,powershell,nested,Function,Powershell,Nested,我有一个简单的工作清单,我想有点自动化。这很简单,通过API获取或发布信息,并生成一些报告,没什么特别的 我决定构建一个主脚本,该脚本指向各种其他脚本,每个脚本处理自己的任务。这些小脚本中的每一个都引用了我构建的实用程序脚本中的函数,该脚本具有所有其他简单作业脚本所共有的函数 当我直接运行它们时,每个脚本都能完美地工作,然而,当我试图通过主脚本运行它们时,它们都失败了 一个例子是,在许多情况下,我需要从API获取数据,但当我需要10k+时,对象返回的上限为1000。为了解决这个问题,我构建了一个

我有一个简单的工作清单,我想有点自动化。这很简单,通过API获取或发布信息,并生成一些报告,没什么特别的

我决定构建一个主脚本,该脚本指向各种其他脚本,每个脚本处理自己的任务。这些小脚本中的每一个都引用了我构建的实用程序脚本中的函数,该脚本具有所有其他简单作业脚本所共有的函数

当我直接运行它们时,每个脚本都能完美地工作,然而,当我试图通过主脚本运行它们时,它们都失败了

一个例子是,在许多情况下,我需要从API获取数据,但当我需要10k+时,对象返回的上限为1000。为了解决这个问题,我构建了一个递归调用自身的函数,直到没有更多的数据可以收集为止。同样,它在自己调用时有效,但不是从主脚本调用,出于某种原因,它在第一次运行后退出(在本例中应运行10多次)。然后,它什么也不返回

我想这可能与我如何界定函数/变量的范围有关??不确定。我尝试了
Global、Local和Script
,但似乎都不起作用。下面是一些代码

*Master Director Script runs script based on user input*

...

&$choice_hash[$action].script_path
实用程序脚本(正在调用的相关函数)


如果我没有遵守程序或礼仪,请提前道歉,我是新来的

如果您在Main.ps1中声明了函数所需的所有变量,那么这应该是可行的。在函数内部创建新变量时,您还可以使用“脚本”作用域,该变量要在函数外部使用。示例
$Script:Var=“Stuff”
在函数中创建的脚本将可用于整个脚本

目录结构

C:\Script\Root
|   Main.ps1
\---Utilities
        fetch_data.ps1
        fetch_more.ps1
        processUsersData.ps1
        process_data.ps1
        selectEnv.ps1
Main.ps1

#---[ Initization ]---#
# Strings
[String]$RootPath = $PSScriptRoot
[String]$UtilPath = "$($RootPath)\Utilities"
[String]$env_choice = $null
[String]$csv_output_path = $null
# Arrays
[Array]$user_data = @()
[Array]$content = @()
[Array]$collated_user_data = @()
[Array]$res = @()

#---[ Source in Utilities ]---#
# Get the scripts
$Utilities = Get-ChildItem -Path "$UtilPath" -File | Where-Object {$_.Extension -eq ".ps1"}
# Source in each one
foreach ($Item in $Utilities) {
   .$Item.FullName
}

#---[ Select an Environment ]---#
# Get the User's choice
$env_choice = selectEnv
# Process the choice
switch ($env_choice) {
   Prod {
      $csv_output_path = '\\etoprod\******\Exports\Report_Users_Prod.csv'
      $user_data = process_data 'Prod' 'api/xm/1/people?embed=roles&limit=1000'
    }
   Dev {
      $csv_output_path = '\\etoprod\******\Exports\Report_Users_Dev.csv'
      $user_data = process_data 'Dev' 'api/xm/1/people?embed=roles&limit=1000'
    }
   Test {
      Write-Output "Test is not an option. Choose wisely."
      exit 1
    }
   Default {
      Write-Output "Unknown Environment Choice."
      exit 1
   }
}

#---[ Process Users and Export ]---#
processUsersData
exportCsv $collated_user_data $csv_output_path
选择env.ps1

function selectEnv {
   $Title = "Environment:"
   $Info = "Please choose an environment"
   # Options
   $Prod = New-Object System.Management.Automation.Host.ChoiceDescription '&Prod', 'Production environment'
   $Dev = New-Object System.Management.Automation.Host.ChoiceDescription '&Dev', 'Development environment'
   $Test = New-Object System.Management.Automation.Host.ChoiceDescription '&Test', 'Testing environment'
   $Options = [System.Management.Automation.Host.ChoiceDescription[]]($Prod, $Dev, $Test)
   $Default = 0
   # Promp the User
   $Choice =  $host.UI.PromptForChoice($Title , $Info , $Options, $Default)
   $Result = $Options[$Choice].Label -Replace '&',''
   return $Result
}
#---[ Initization ]---#
# Strings
[String]$RootPath = $PSScriptRoot
[String]$UtilPath = "$($RootPath)\Utilities"
[String]$env_choice = $null
[String]$csv_output_path = $null
# Arrays
[Array]$user_data = @()
[Array]$content = @()
[Array]$collated_user_data = @()
[Array]$res = @()

#---[ Source in Utilities ]---#
# Get the scripts
$Utilities = Get-ChildItem -Path "$UtilPath" -File | Where-Object {$_.Extension -eq ".ps1"}
# Source in each one
foreach ($Item in $Utilities) {
   .$Item.FullName
}

#---[ Select an Environment ]---#
# Get the User's choice
$env_choice = selectEnv
# Process the choice
switch ($env_choice) {
   Prod {
      $csv_output_path = '\\etoprod\******\Exports\Report_Users_Prod.csv'
      $user_data = process_data 'Prod' 'api/xm/1/people?embed=roles&limit=1000'
    }
   Dev {
      $csv_output_path = '\\etoprod\******\Exports\Report_Users_Dev.csv'
      $user_data = process_data 'Dev' 'api/xm/1/people?embed=roles&limit=1000'
    }
   Test {
      Write-Output "Test is not an option. Choose wisely."
      exit 1
    }
   Default {
      Write-Output "Unknown Environment Choice."
      exit 1
   }
}

#---[ Process Users and Export ]---#
processUsersData
exportCsv $collated_user_data $csv_output_path
function selectEnv {
   $Title = "Environment:"
   $Info = "Please choose an environment"
   # Options
   $Prod = New-Object System.Management.Automation.Host.ChoiceDescription '&Prod', 'Production environment'
   $Dev = New-Object System.Management.Automation.Host.ChoiceDescription '&Dev', 'Development environment'
   $Test = New-Object System.Management.Automation.Host.ChoiceDescription '&Test', 'Testing environment'
   $Options = [System.Management.Automation.Host.ChoiceDescription[]]($Prod, $Dev, $Test)
   $Default = 0
   # Promp the User
   $Choice =  $host.UI.PromptForChoice($Title , $Info , $Options, $Default)
   $Result = $Options[$Choice].Label -Replace '&',''
   return $Result
}