Function Powershell脚本在直接运行时工作,但在被另一方调用时不工作
我有一个简单的工作清单,我想有点自动化。这很简单,通过API获取或发布信息,并生成一些报告,没什么特别的 我决定构建一个主脚本,该脚本指向各种其他脚本,每个脚本处理自己的任务。这些小脚本中的每一个都引用了我构建的实用程序脚本中的函数,该脚本具有所有其他简单作业脚本所共有的函数 当我直接运行它们时,每个脚本都能完美地工作,然而,当我试图通过主脚本运行它们时,它们都失败了 一个例子是,在许多情况下,我需要从API获取数据,但当我需要10k+时,对象返回的上限为1000。为了解决这个问题,我构建了一个递归调用自身的函数,直到没有更多的数据可以收集为止。同样,它在自己调用时有效,但不是从主脚本调用,出于某种原因,它在第一次运行后退出(在本例中应运行10多次)。然后,它什么也不返回 我想这可能与我如何界定函数/变量的范围有关??不确定。我尝试了Function Powershell脚本在直接运行时工作,但在被另一方调用时不工作,function,powershell,nested,Function,Powershell,Nested,我有一个简单的工作清单,我想有点自动化。这很简单,通过API获取或发布信息,并生成一些报告,没什么特别的 我决定构建一个主脚本,该脚本指向各种其他脚本,每个脚本处理自己的任务。这些小脚本中的每一个都引用了我构建的实用程序脚本中的函数,该脚本具有所有其他简单作业脚本所共有的函数 当我直接运行它们时,每个脚本都能完美地工作,然而,当我试图通过主脚本运行它们时,它们都失败了 一个例子是,在许多情况下,我需要从API获取数据,但当我需要10k+时,对象返回的上限为1000。为了解决这个问题,我构建了一个
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
}