Azure Automation中PowerShell 7.2运行簿间共享变量与函数方法问询
Azure Automation运行簿间共享变量与通用函数的解决方案
环境与问题背景
- 运行时环境:PowerShell 7.2
- 现有两个Azure Automation运行簿:
init和main init运行簿内容:
$var1 = "hello" $var2 = "world" function Add-WB { param ( [string]$P1, [string]$P2 ) return "$P1 $P2" }
main运行簿需调用init中的变量与函数,但两种尝试均失败:- 使用
. .\init.ps1的方式在PowerShell 5.1中正常工作,但PowerShell 7.2执行报错 - 通过
Start-AutomationRunbook或Start-AzAutomationRunbook触发init执行后,main仍无法访问其变量与函数
- 使用
可行解决方案
方法1:使用自定义模块共享(推荐)
将通用变量与函数打包为Azure Automation自定义模块,这是官方推荐的共享方式,兼容PowerShell 7.2:
- 创建脚本文件
CommonFunctions.ps1,将init中的内容移入:
$var1 = "hello" $var2 = "world" function Add-WB { param ( [string]$P1, [string]$P2 ) return "$P1 $P2" }
- 将脚本压缩为
.zip包(确保压缩包直接包含脚本,无嵌套文件夹) - 在Azure Automation账户的「模块」页面上传该zip包作为自定义模块
- 在
main运行簿中导入并使用:
Import-Module CommonFunctions Write-Output "test var1: $var1" Write-Output "test var2: $var2" Add-WB -P1 "wb1" -P2 "wb2"
方法2:通过脚本运行簿输出加载内容
修改init为脚本类型运行簿,输出变量与函数的定义代码,再在main中调用并执行:
- 修改
init运行簿,输出可执行的脚本块:
# 输出变量定义 @' $var1 = "hello" $var2 = "world" '@ # 输出函数定义 @' function Add-WB { param ( [string]$P1, [string]$P2 ) return "$P1 $P2" } '@
- 在
main运行簿中调用init并加载输出:
$automationAccountName = "你的自动化账户名" $resourceGroupName = "你的资源组名" # 调用init并获取输出内容 $initOutput = Invoke-AzAutomationRunbook -AutomationAccountName $automationAccountName ` -ResourceGroupName $resourceGroupName ` -Name "init" ` -Wait ` -ErrorAction Stop # 执行输出中的脚本,加载变量与函数 $initOutput | ForEach-Object { Invoke-Expression $_ } # 验证使用 Write-Output "test var1: $var1" Write-Output "test var2: $var2" Add-WB -P1 "wb1" -P2 "wb2"
注意:需确保main运行簿拥有调用Invoke-AzAutomationRunbook的权限。
方法3:全局变量共享(仅适用于变量)
若仅需共享变量,可使用Azure Automation全局变量:
- 在Azure Automation账户的「变量」页面,创建
var1和var2全局变量并设置对应值 - 在
main运行簿中直接读取:
$automationAccountName = "你的自动化账户名" $resourceGroupName = "你的资源组名" $var1 = Get-AzAutomationVariable -AutomationAccountName $automationAccountName ` -ResourceGroupName $resourceGroupName ` -Name "var1" ` -ErrorAction Stop $var2 = Get-AzAutomationVariable -AutomationAccountName $automationAccountName ` -ResourceGroupName $resourceGroupName ` -Name "var2" ` -ErrorAction Stop Write-Output "test var1: $var1" Write-Output "test var2: $var2"
内容的提问来源于stack exchange,提问作者wenbo
相关产品推荐
相关产品推荐

