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

如何将ARM模板参数动态传递给CustomScriptExtension脚本参数

解决方案

你当前已经定义的ARM参数文件不需要做任何修改,保持现有的proxyinfos数组结构即可,只需要调整ARM模板的自定义脚本扩展配置和PowerShell脚本的参数接收逻辑即可:

步骤1:调整ARM模板的自定义脚本扩展参数传递

在ARM模板的CustomScriptExtension资源配置中,通过ARM内置的string()函数将proxyinfos数组序列化为JSON字符串,通过命令行参数传递给PowerShell脚本,示例配置如下:

{
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "apiVersion": "2023-03-01",
  "name": "[concat(variables('vmName'),'/CustomScriptExtension')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "publisher": "Microsoft.Compute",
    "type": "CustomScriptExtension",
    "typeHandlerVersion": "1.10",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "[uri(parameters('_artifactsLocation'), concat('configure-proxy.ps1', parameters('_artifactsLocationSasToken')))]"
      ],
      // 核心逻辑:将proxyinfos数组转为JSON字符串传入脚本
      "commandToExecute": "[concat('powershell.exe -ExecutionPolicy Unrestricted -File configure-proxy.ps1 -proxyInfosJson ', string(parameters('proxyinfos')))]"
    }
  }
}

如果参数包含敏感信息,可将commandToExecute放在protectedSettings节点下。

步骤2:修改PowerShell脚本适配参数

在脚本开头添加JSON参数接收逻辑,将传入的JSON字符串转换为你需要的哈希表数组即可,原有业务逻辑不需要修改:

param(
    [string]$proxyInfosJson
)

# 将JSON字符串转为哈希表数组
$proxyinfos = ($proxyInfosJson | ConvertFrom-Json) | ForEach-Object {
    $hashTable = @{}
    $_.PSObject.Properties | ForEach-Object {
        $hashTable[$_.Name] = $_.Value
    }
    $hashTable
}

# 以下保留你原有的业务逻辑即可
function set-proxy {
    param(
        [parameter(ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True, HelpMessage = "proxy informations")]
        [hashtable[]]$proxyinfos
    )
    
    foreach ($proxyinfo in $proxyinfos){
    netsh interface portproxy add v4tov4 listenaddress=$($proxyinfo.listenaddress) `
    listenport=$($proxyinfo.listenport) connectaddress=$($proxyinfo.connectaddress) connectport=$($proxyinfo.connectport)
    }
}

function set-firewall {
    param(
        [parameter(ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True, HelpMessage = "proxy informations")]
        [hashtable[]]$proxyinfos
    )
    
    foreach ($proxyinfo in $proxyinfos){
        New-NetFirewallRule -DisplayName $($proxyinfo.firewallrulename) -Direction $($proxyinfo.direction) `
        -LocalPort $($proxyinfo.listenport) -Protocol $($proxyinfo.protocol) -Action $($proxyinfo.action)
    }
}

set-proxy $proxyinfos
set-firewall $proxyinfos

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:54:04