本文介绍用于从外部文件加载内容的 Bicep 函数。
loadDirectoryFileInfo
loadDirectoryFileInfo(directoryPath, [searchPattern])
将目录文件的基本信息加载为 Bicep 对象。 该函数在编译过程中加载文件,而非运行时。
命名空间: sys。
参数
| 参数 | 必选 | 类型 | DESCRIPTION |
|---|---|---|---|
| directoryPath | 是的 | 字符串 | 路径相对于调用此函数的 Bicep 文件。 如果变量是编译时常量,你可以用,但不能用参数。 |
| searchPattern | 否 | 字符串 | 加载文件时要使用的搜索模式。 这种模式可以包含万用牌。 |
返回值
对象数组,每个对象表示目录中的文件。 每个对象包含以下属性:
| 资产 | 类型 | DESCRIPTION |
|---|---|---|
| baseName | 字符串 | 文件的名称。 |
| 扩展 | 字符串 | 文件的扩展名。 |
| relativePath | 字符串 | 当前模板的相对路径。 |
例子
以下示例加载目录中所有 Bicep 文件 ./modules/ 的文件信息。
var dirFileInfo = loadDirectoryFileInfo('./modules/', '*.bicep')
output dirFileInfoOutput object[] = dirFileInfo
该文件夹仅包含一个名为 . appService.bicep. 输出为:
[{"relativePath":"modules/appService.bicep","baseName":"appService.bicep","extension":".bicep"}]
loadFileAsBase64
loadFileAsBase64(filePath)
将文件加载为 base64 字符串。
命名空间: sys。
参数
| 参数 | 必选 | 类型 | DESCRIPTION |
|---|---|---|---|
| 文件路径 | 是的 | 字符串 | 要加载的文件的路径。 路径相对于已部署的 Bicep 文件。 它不能包含变量。 |
注解
当你有二进制内容想在部署中包含时,可以使用这个函数。 与其手动将文件编码成base64字符串再添加到你的Bicep文件中,不如用这个函数加载文件。 将 Bicep 文件编译为 JSON 模板时,将加载该文件。 你不能在文件路径中使用变量,因为编译器在编译到模板时不会解析它们。 在部署期间,JSON 模板包含文件的内容作为硬编码字符串。
此函数需要 Bicep CLI 0.4.X 或更高版本。
文件的最大允许大小为 96 KB。
返回值
该文件作为 base64 字符串。
例子
以下示例将PowerShell脚本加载为base64字符串,并与虚拟机(VM)的自定义脚本扩展一起使用。
param vmName string
param location string
resource vmExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
name: '${vmName}/CustomScriptExtension'
location: location
properties: {
publisher: 'Microsoft.Compute'
type: 'CustomScriptExtension'
typeHandlerVersion: '1.10'
autoUpgradeMinorVersion: true
forceUpdateTag: 'true'
protectedSettings: {
commandToExecute: 'powershell.exe -ExecutionPolicy Unrestricted -Command "iex ""& { $([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(\'${loadFileAsBase64('vm-provisioning.ps1')}\'))) } -ParamX foo -ParamY bar"""'
}
}
}
注释
这个例子没有使用 PowerShell -EncodedCommand 参数。
-EncodedCommand 期望收到UTF-16LE编码的命令。 本示例则将 base64 字符串传递给 PowerShell,并在调用脚本前明确将其译为 UTF-8。
脚本文件在 Bicep 编译过程中加载,并以 base64 编码字符串的形式嵌入生成的 JSON 模板中。 部署运行时,PowerShell 解码字符串并在虚拟机上调用脚本。 这种方法在直接将脚本内容 commandToExecute嵌入 时非常有用,因为它避免了多行脚本内容中常见的引用、转义和换行问题。
你也可以用内 base64() 联多行字符串编码,并将命名参数传递给解码后的脚本。 更多信息请参见 多行字符串文字。
var scriptContent = '''
param(
[string] $Name
)
Write-Host "Hello $Name!"
'''
var scriptArgs = {
Name: 'MyValue'
}
// Builds a string of the form '-ArgA ValA -ArgB ValB'
var argumentString = join(map(items(scriptArgs), i => '-${i.key} ${i.value}'), ' ')
var commandToExecute = 'powershell.exe -ExecutionPolicy Unrestricted -Command "iex \\"& { $([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(\'${base64(scriptContent)}\'))) } ${argumentString}\\""'
注释
这个例子之所以成立,是因为参数值(MyValue)不包含特殊字符。 简单的 join/map 建造者不会逃避或报价。 如果任何值包含空格(必须用引号包裹)、单引号、双引号或其他对PowerShell命令行参数解析器特殊(必须用 replace()转义)的字符,则该判例将失败。
关于正确处理布尔、整数、字符串(带完整转义)、数组和对象的完整示例,请参见“ 创建复杂输入和输出的部署脚本”。
loadJsonContent
loadJsonContent(filePath, [jsonPath], [encoding])
将指定的 JSON 文件加载为 Any 对象。
命名空间: sys。
参数
| 参数 | 必选 | 类型 | DESCRIPTION |
|---|---|---|---|
| 文件路径 | 是的 | 字符串 | 要加载的文件的路径。 路径相对于已部署的 Bicep 文件。 它不能包含变量。 |
| jsonPath | 否 | 字符串 | 用于指定仅加载文件的一部分的 JSONPath 表达式。 |
| 编码 | 否 | 字符串 | 文件编码。 默认值是 utf-8。 可用选项包括:iso-8859-1、、us-asciiutf-16、utf-16BE或utf-8。 |
注解
当你有 JSON 内容或压缩后存储在单独文件中的 JSON 内容时,可以使用这个函数。 不要在 Bicep 文件中复制 JSON 内容,而是用这个函数加载内容。 可以通过指定 JSON 路径来加载 JSON 文件的一部分。 Bicep编译器在将Bicep文件编译成JSON模板时加载该文件。 你不能在文件路径中包含变量,因为编译器在编译到模板时无法解析它们。 在部署期间,JSON 模板包含文件的内容作为硬编码字符串。
在 VS Code 中,IntelliSense 可用于加载对象的属性。 例如,可以创建一个文件,其中包含要跨多个 Bicep 文件共享的值。 本文显示了一个示例。
此函数需要 Bicep CLI 0.7.X 或更高版本。
文件的最大允许大小为 1,048,576 个字符,包括行尾。
返回值
文件的内容作为 Any 对象。
例子
以下示例创建一个 JSON 文件,其中包含网络安全组的值。
{
"description": "Allows SSH traffic",
"protocol": "Tcp",
"sourcePortRange": "*",
"destinationPortRange": "22",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*",
"access": "Allow",
"priority": 100,
"direction": "Inbound"
}
加载该文件并将其转换为 JSON 对象。 使用对象将值分配给资源。
param location string = resourceGroup().location
var nsgconfig = loadJsonContent('nsg-security-rules.json')
resource newNSG 'Microsoft.Network/networkSecurityGroups@2025-01-01' = {
name: 'example-nsg'
location: location
properties: {
securityRules: [
{
name: 'SSH'
properties: nsgconfig
}
]
}
}
可以在部署网络安全组的其他 Bicep 文件中重复使用值的文件。
loadYamlContent
loadYamlContent(filePath, [pathFilter], [encoding])
将指定的 YAML 文件加载为 Any 对象。
命名空间: sys。
参数
| 参数 | 必选 | 类型 | DESCRIPTION |
|---|---|---|---|
| 文件路径 | 是的 | 字符串 | 要加载的文件的路径。 路径相对于已部署的 Bicep 文件。 它不能包含变量。 |
| pathFilter | 否 | 字符串 | 路径筛选器是一个 JSONPath 表达式,用于指定仅加载文件的一部分。 |
| 编码 | 否 | 字符串 | 文件编码。 默认值是 utf-8。 可用选项包括:iso-8859-1、、us-asciiutf-16、utf-16BE或utf-8。 |
注解
当你有 YAML 内容或压缩后存储在单独文件中的 YAML 内容时,可以使用这个函数。 不要在 Bicep 文件中复制 YAML 内容,而是用这个函数加载内容。 可以通过指定路径筛选器来加载 YAML 文件的一部分。 Bicep编译器在将Bicep文件编译为YAML模板时加载该文件。 你不能在文件路径中包含变量,因为编译器在编译到模板时无法解析它们。 在部署期间,YAML 模板包含文件的内容作为硬编码字符串。
在 VS Code 中,IntelliSense 可用于加载对象的属性。 例如,可以创建一个文件,其中包含要跨多个 Bicep 文件共享的值。 本文显示了一个示例。
此函数需要 Bicep CLI 0.16.X 或更高版本。
文件的最大允许大小为 1,048,576 个字符,包括行尾。
返回值
文件的内容作为 Any 对象。
例子
以下示例创建一个 YAML 文件,其中包含网络安全组的值。
description: "Allows SSH traffic"
protocol: "Tcp"
sourcePortRange: "*"
destinationPortRange: "22"
sourceAddressPrefix: "*"
destinationAddressPrefix: "*"
access: "Allow"
priority: 100
direction: "Inbound"
加载该文件并将其转换为 JSON 对象。 使用对象将值分配给资源。
param location string = resourceGroup().location
var nsgconfig = loadYamlContent('nsg-security-rules.yaml')
resource newNSG 'Microsoft.Network/networkSecurityGroups@2025-01-01' = {
name: 'example-nsg'
location: location
properties: {
securityRules: [
{
name: 'SSH'
properties: nsgconfig
}
]
}
}
可以在部署网络安全组的其他 Bicep 文件中重复使用值的文件。
loadTextContent
loadTextContent(filePath, [encoding])
将指定文件的内容作为字符串加载。
命名空间: sys。
参数
| 参数 | 必选 | 类型 | DESCRIPTION |
|---|---|---|---|
| 文件路径 | 是的 | 字符串 | 要加载的文件的路径。 路径相对于已部署的 Bicep 文件。 它不能包含变量。 |
| 编码 | 否 | 字符串 | 文件编码。 默认值是 utf-8。 可用选项包括:iso-8859-1、、us-asciiutf-16、utf-16BE或utf-8。 |
注解
如果内容存储在单独的文件中,请使用此函数。 可以加载内容,而不是在 Bicep 文件中复制它。 例如,可以从文件加载部署脚本。 将 Bicep 文件编译为 JSON 模板时,将加载该文件。 你不能在文件路径中包含任何变量,因为编译到模板时变量不会被解析。 在部署期间,JSON 模板包含文件的内容作为硬编码字符串。
要加载JSON文件,请使用该 loadJsonContent() 函数。
此函数需要 Bicep CLI 0.4.X 或更高版本。
文件允许的最大大小为 131,072 个字符,包括行尾。
返回值
文件的内容作为字符串。
例子
以下示例展示了如何从文件加载脚本并用于部署脚本。
resource exampleScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
name: 'exampleScript'
location: resourceGroup().location
kind: 'AzurePowerShell'
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'/subscriptions/{sub-id}/resourcegroups/{rg-name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{id-name}': {}
}
}
properties: {
azPowerShellVersion: '14.0'
scriptContent: loadTextContent('myscript.ps1')
retentionInterval: 'P1D'
}
}
后续步骤
有关 Bicep 文件中各部分的说明,请参阅了解 Bicep 文件的结构和语法。