You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins中使用PowerShell参数?Azure VM启停自动化参数故障排查

解决你的Azure VM启停自动化与Jenkins参数问题

我来帮你一步步拆解这两个问题,先搞定PowerShell参数无效的坑,再讲Jenkins里怎么用PowerShell参数:


问题1:$OPTION参数没效果?核心逻辑缺失啦!

从你贴的代码来看,你已经成功拿到了带指定标签的VM列表,但完全没写基于$OPTION执行启停操作的逻辑——这就是参数没反应的关键!我帮你补全这部分,顺便排查常见坑:

先补全带$OPTION判断的完整脚本

首先要确保你正确声明了$OPTION参数,然后加上启停的核心逻辑:

# 先声明参数(如果是脚本文件的话,这一步很重要)
param(
    [Parameter(Mandatory=$true)]
    [ValidateSet("Start", "Stop")] # 限制参数只能是这两个值,避免输入错误
    [string]$OPTION
)

# 你的认证代码,注意这里要改个地方!
Add-AzureRmAccount -Credential $psCred -TenantId <removed> -ServicePrincipal
# 原来的Get-AzureRmSubscription只是查询,不会切换订阅,必须用Select才能让后续命令生效
Select-AzureRmSubscription -SubscriptionName "<removed>"

# 获取目标VM列表(这部分你写的没问题)
$vms = Find-AzureRmResource | Where-Object {($_.tags.Project -eq "DevOps") -And ($_.tags.Test -eq "ernest")} | Select-Object Name, ResourceGroupName
$vms
Write-Output "..."

# 核心:根据$OPTION执行启停操作
foreach ($vm in $vms) {
    Write-Host "正在处理VM: $($vm.Name)(资源组:$($vm.ResourceGroupName))"
    if ($OPTION -eq "Start") {
        Start-AzureRmVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName
        Write-Host "✅ 已启动VM: $($vm.Name)"
    } elseif ($OPTION -eq "Stop") {
        # 加-Force避免弹出确认提示
        Stop-AzureRmVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force
        Write-Host "⏹️ 已停止VM: $($vm.Name)"
    } else {
        Write-Error "❌ 无效的OPTION值!请用'Start'或'Stop'"
    }
}

常见排查点

  • 订阅没切换:你原来用Get-AzureRmSubscription只是查询订阅,不会切换到目标订阅,必须用Select-AzureRmSubscription,否则后续VM操作会跑到默认订阅去,自然没效果。
  • 参数没传对:如果是手动运行脚本,要这么传参数:.\你的脚本名.ps1 -OPTION Start;如果是Jenkins调用,往下看问题2的传参方法。
  • 权限不够:你的服务主体需要有VM的启停权限(Microsoft.Compute/virtualMachines/start/action和Microsoft.Compute/virtualMachines/deallocate/action),可以去掉命令里的-ErrorAction SilentlyContinue(如果加了的话),看看是不是有权限报错。

问题2:Jenkins里怎么用PowerShell参数?

Jenkins里给PowerShell传参数,最常用的是两种方式,根据你的场景选:

方式1:用Jenkins参数化构建(推荐,适合需要手动选择启停的场景)

  1. 打开你的Jenkins任务,勾选**「This project is parameterized」**(这个项目是参数化的)。
  2. 添加一个**「Choice Parameter」**(选项参数),名称填OPTION,选项里换行写Start和Stop。
  3. 在PowerShell构建步骤里,直接用$env:OPTION获取Jenkins的参数值,或者把它传给你的脚本:
# 如果是内联脚本,直接用环境变量
$selectedOption = $env:OPTION
Write-Host "Jenkins传入的参数是:$selectedOption"

# 如果是调用外部脚本,这么传
.\你的VM启停脚本.ps1 -OPTION $env:OPTION

方式2:直接在PowerShell步骤里硬编码或用Jenkins变量

如果不需要手动选择参数,比如固定每天启停,直接在PowerShell里写死参数:

.\你的VM启停脚本.ps1 -OPTION "Stop"

或者用Jenkins的内置变量,比如根据构建编号判断,但这个场景用得少。

额外提醒

  • 建议把AzureRM模块换成Az模块,因为AzureRM已经停止维护了,Az是官方推荐的新版本,命令只要把AzureRm换成Az就行,比如Start-AzVM、Stop-AzVM。
  • 确保Jenkins服务器上已经安装了对应的Azure PowerShell模块,可以在PowerShell步骤里先运行Install-Module -Name Az -Force -AllowClobber(第一次运行需要管理员权限)。

内容的提问来源于stack exchange,提问作者bonafide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:16:35