powershell 什么是检测脚本是否在Azure自动化中运行的正确方法?

dgsult0t  于 2023-10-18  发布在  Shell
关注(0)|答案(3)|浏览(125)

使用Azure自动化开发PowerShell脚本可能会非常缓慢。这可以通过使用PowerShell伊势插件来帮助,该插件允许您在本地测试运行脚本。
但是,不可避免的是,在本地运行时,有些事情会与在Azure自动化中运行时有所不同。例如文件路径。
检测脚本当前运行环境的正确方法是什么?
目前我定义了一个可变资产,我只保留在本地,不上传。然后我可以这样做:

# Check if we are running locally - NOTE: Do not upload the runningLocally variable! Keep it local only
if (Get-AutomationVariable -Name 'runningLocally') { 
    # We are running locally
} else { 
    # We are running in Azure Automation
}

但这似乎相当笨重和容易出错。我正在寻找一种更强大和可靠的方法。
我发现了一些额外的方法。在AA中运行时,机器和用户名都是“客户端”,这似乎是一个更健壮的方法?

enxuqcxy

enxuqcxy1#

适用于PowerShell 5.1、7.1和7.2

this answer中的$PSPrivateMetadata.JobId在使用PowerShell 7.1的Azure自动化Runbook上不起作用,因此我搜索了另一种解决方案,最终找到了合适的环境变量($env:AZUREPS_HOST_ENVIRONMENT)。
它在PowerShell 5.1和PowerShell 7.1的Azure自动化运行手册中返回“AzureAutomation/”,并且不存在于本地环境中。

if ("AzureAutomation/" -eq $env:AZUREPS_HOST_ENVIRONMENT -or $PSPrivateMetadata.JobId) {
    # Azure Automation
}
else {
    # Local
}

如果你只想区分“本地”和“任何其他环境”,你可以使用这个简短的版本:

if ($env:AZUREPS_HOST_ENVIRONMENT -or $PSPrivateMetadata.JobId) {
    # Not local
}
else {
    # Local
}

**更新(2023年9月20日):**根据this blog post$PSPrivateMetadata.JobId现在也可以在PowerShell 7.2中使用,因此更新的代码段应该可以在PowerShell 5.1,7.1和7.2上使用。

q8l4jmvw

q8l4jmvw2#

您可以使用您已经发现的用户名/计算机名进行此操作,或者您可以检查是否存在Runbook作业ID:

if($PSPrivateMetadata.JobId) {
   # in Azure Automation
}
else {
   # not in Azure Automation
}
v8wbuo2f

v8wbuo2f3#

不确定是否有一个“正确的方法”,但如果你想检查你是否在Powershell伊势中运行脚本,你可以检查$psISE-变量是否存在。

#same as if($psISE -ne $null) {...  
if($psISE) {
    #In PowerShell ISE
} else {
    #PowerShell console or Azure Automation
}

相关问题