"customerName": "@concat(parameters('firstName'), parameters('lastName'))"
无论使用哪种方式,这两个示例都会将结果分配给 customerName
属性。
使用函数的注意事项
设计器不会计算在设计时用作函数参数的运行时表达式。 设计器要求在设计时可以完全计算所有表达式。
从左到右评估函数参数。
在参数定义的语法中,参数后显示的问号 (?) 表示参数是可选的。 有关示例,请参阅 getFutureTime()。
以纯文本内联显示的函数表达式需要使用封闭的大括号 ({}) 以使用表达式的内插格式。 此格式有助于避免分析问题。 如果函数表达式没有以纯文本内联显示,则无需大括号。
以下示例显示了正确和不正确的语法:
正确:"<text>/@{<function-name>('<parameter-name>')}/<text>"
不正确:"<text>/@<function-name>('<parameter-name>')/<text>"
正常:"@<function-name>('<parameter-name>')"
以下各部分根据函数的常规用途来划分和组织函数,也可以按字母顺序浏览这些函数。
字符串函数
若要使用字符串,可以使用这些字符串函数以及某些集合函数。 字符串函数仅适用于字符串。
字符串函数
若要更改值的类型或格式,可以使用这些转换函数。 例如,可将值从布尔值更改为整数。 有关 Azure 逻辑应用在转换期间如何处理内容类型的详细信息,请参阅处理内容类型。 有关每个函数的完整参考,请参阅按字母排序的列表。
Azure 逻辑应用会自动或隐式执行 base64 编码和解码,因此你无需使用编码和解码函数手动执行这些转换。 但是,如果你仍然在设计器中使用这些函数,则可能会在设计器中遇到意外的呈现行为。 这些行为仅影响函数的可见性,而不影响其效果,除非你编辑函数的参数值,这样会从代码中删除函数及其效果。 有关详细信息,请参阅隐式数据类型转换。
隐式数据类型转换
Azure 逻辑应用会自动或隐式地在某些数据类型之间进行转换,因此你无需手动执行这些转换。 例如,如果在预期应输入字符串的情况下输入了非字符串值,则 Azure 逻辑应用会自动将非字符串值转换为字符串。
例如,假设触发器返回一个数值作为输出:
triggerBody()?['123']
如果在需要字符串作为输入(如 URL)的地方使用了此数值输出值,则 Azure 逻辑应用会使用大括号 ({}
) 表示法自动将该值转换为字符串:
@{triggerBody()?['123']}
Base64 编码和解码
Azure 逻辑应用会自动或隐式执行 base64 编码或解码,因此你无需使用相应的函数手动执行这些转换:
base64(<value>)
base64ToBinary(<value>)
base64ToString(<value>)
base64(decodeDataUri(<value>))
concat('data:;base64,',<value>)
concat('data:,',encodeUriComponent(<value>))
decodeDataUri(<value>)
如果你在使用设计器时手动添加任何这些函数(直接添加到触发器或操作中或者使用表达式编辑器),则请先离开设计器,然后再返回到设计器,这样该函数就会从设计器中消失,只留下参数值。 如果你选择一个使用此函数的触发器或操作而不编辑函数的参数值,则也会出现此行为。
此结果只影响函数的可见性,而不影响效果。 在代码视图中,函数不受影响。
但是,如果你编辑函数的参数值,则会从代码视图中删除函数及其效果,而只留下函数的参数值。
若要使用整数和浮点数,可以使用这些数学函数。
有关每个函数的完整参考,请参阅按字母排序的列表。
返回“当前”操作在运行时的输出,或者来自其他 JSON 名称和值对的值,可以将其分配给表达式。
默认情况下,此函数引用整个操作对象,但是也可以指定你需要其值的属性。
另请参阅 actions()。
只能在以下位置使用 action()
函数:
Webhook 操作的 unsubscribe
属性,用以访问原始 subscribe
请求的结果
操作的 trackedProperties
属性
操作的 do-until
循环条件
action()
action().outputs.body.<property>
"UserName": "ContosoInc",
"FollowersCount": 172,
"Description": "Leading the way in transforming the digital workplace.",
"StatusesCount": 93,
"FriendsCount": 126,
"FavouritesCount": 46,
"ProfileImageUrl": "https://pbs.twimg.com/profile_images/908820389907722240/gG9zaHcd_400x400.jpg"
actionOutputs
返回操作在运行时的输出。 是 actions('<actionName>').outputs
的速记。 请参阅 actions()。 actionOutputs()
函数在设计器中解析为 outputs()
,因此请考虑使用 outputs(),而不是 actionOutputs()
。 虽然这两个函数的工作方式相同,但首选 outputs()
。
actionOutputs('<actionName>')
"Pragma": "no-cache",
"Vary": "Accept-Encoding",
"x-ms-request-id": "a916ec8f52211265d98159adde2efe0b",
"X-Content-Type-Options": "nosniff",
"Timing-Allow-Origin": "*",
"Cache-Control": "no-cache",
"Date": "Mon, 09 Apr 2018 18:47:12 GMT",
"Set-Cookie": "ARRAffinity=b9400932367ab5e3b6802e3d6158afffb12fcde8666715f5a5fbd4142d0f0b7d;Path=/;HttpOnly;Domain=twitter-wus.azconn-wus.p.azurewebsites.net",
"X-AspNet-Version": "4.0.30319",
"X-Powered-By": "ASP.NET",
"Content-Type": "application/json; charset=utf-8",
"Expires": "-1",
"Content-Length": "339"
"body": {
"FullName": "Contoso Corporation",
"Location": "Generic Town, USA",
"Id": 283541717,
"UserName": "ContosoInc",
"FollowersCount": 172,
"Description": "Leading the way in transforming the digital workplace.",
"StatusesCount": 93,
"FriendsCount": 126,
"FavouritesCount": 46,
"ProfileImageUrl": "https://pbs.twimg.com/profile_images/908820389907722240/gG9zaHcd_400x400.jpg"
actions
返回操作在运行时的输出,或者来自其他 JSON 名称和值对的值,可以将其分配给表达式。 默认情况下,此函数引用整个操作对象,但是也可以指定你需要其值的属性。
有关速记版本,请参阅 actionBody()、actionOutputs() 和 body()。
有关当前操作,请参阅 action()。
actions()
函数以字符串的形式返回输出。 如果需要将返回值用作 JSON 对象,则首先需要转换字符串值。 可以使用分析 JSON 操作将字符串值转换为 JSON 对象。
以前,当指定基于另一操作的输出运行的操作时,可以使用 actions()
函数或 conditions
元素。 但是,若要显式声明操作之间的依赖关系,现在必须使用依赖的操作的 runAfter
属性。
若要详细了解 runAfter
属性,请参阅使用 runAfter 属性捕获和处理故障。
actions('<actionName>')
actions('<actionName>').outputs.body.<property>
此示例将 middleName
属性加到 JSON 对象,可通过 JSON() 函数将其从字符串转换为 JSON。 该对象已经包含 firstName
和 surName
属性。 该函数将指定的值分配给新属性,并返回更新后的对象:
addProperty(json('{ "firstName": "Sophia", "lastName": "Owen" }'), 'middleName', 'Anne')
下面是当前的 JSON 对象:
"firstName": "Sophia",
"surName": "Owen"
下面是已更新的 JSON 对象:
"firstName": "Sophia",
"middleName": "Anne",
"surName": "Owen"
此示例将 middleName
子属性加到 JSON 对象中的现有 customerName
属性,可通过 JSON() 函数将其从字符串转换为 JSON。 该函数将指定的值分配给新属性,并返回更新后的对象:
setProperty(json('{ "customerName": { "firstName": "Sophia", "surName": "Owen" } }'), 'customerName', addProperty(json('{ "customerName": { "firstName": "Sophia", "surName": "Owen" } }')['customerName'], 'middleName', 'Anne'))
下面是当前的 JSON 对象:
"customerName": {
"firstName": "Sophia",
"surName": "Owen"
下面是已更新的 JSON 对象:
"customerName": {
"firstName": "Sophia",
"middleName": "Anne",
"surName": "Owen"
addSeconds
将秒添加到时间戳。
addSeconds('<timestamp>', <seconds>, '<format>'?)
addToTime('2018-01-01T00:00:00Z', 1, 'Day', 'D')
并使用可选的“D”格式返回结果:"Tuesday, January 2, 2018"
检查所有表达式是否为 true。
当所有表达式均为 true 时返回 true,当至少一个表达式为 false 时返回 false。
and(<expression1>, <expression2>, ...)
第一个示例:两个表达式均为 true,因此返回 true
。
第二个示例:一个表达式为 false,因此返回 false
。
第三个示例:两个表达式均为 false,因此返回 false
。
这些示例检查指定的表达式是否均为 true:
and(equals(1, 1), equals(2, 2))
and(equals(1, 1), equals(1, 2))
and(equals(1, 2), equals(1, 3))
并返回以下结果:
第一个示例:两个表达式均为 true,因此返回 true
。
第二个示例:一个表达式为 false,因此返回 false
。
第三个示例:两个表达式均为 false,因此返回 false
。
array
从单个指定的输入返回数组。
对于多个输入,请参阅 createArray()。
array('<value>')
Azure 逻辑应用会自动或隐式执行 base64 编码和解码,因此你无需使用编码和解码函数手动执行这些转换。 但是,如果你仍然使用这些函数,则可能会在设计器中遇到意外的呈现行为。
这些行为仅影响函数的可见性,而不影响其效果,除非你编辑函数的参数值,这样会从代码中删除函数及其效果。 有关详细信息,请参阅 Base64 编码和解码。
base64('<value>')
Azure 逻辑应用会自动或隐式执行 base64 编码和解码,因此你无需使用编码和解码函数手动执行这些转换。 但是,如果你仍然在设计器中使用这些函数,则可能会在设计器中遇到意外的呈现行为。 这些行为仅影响函数的可见性,而不影响其效果,除非你编辑函数的参数值,这样会从代码中删除函数及其效果。 有关详细信息,请参阅 Base64 编码和解码。
base64ToBinary('<value>')
base64ToBinary('aGVsbG8=')
例如,假设你正在使用 HTTP 操作发送请求。 你可以使用 base64ToBinary()
将 base64 编码字符串转换为二进制数据,并使用请求中的 application/octet-stream
内容类型发送该数据。
base64ToString
返回 base64 编码字符串的字符串版本,有效地对 base64 字符串进行解码。 使用此函数,而不是已弃用的 decodeBase64()。
Azure 逻辑应用会自动或隐式执行 base64 编码和解码,因此你无需使用编码和解码函数手动执行这些转换。 但是,如果你仍然在设计器中使用这些函数,则可能会在设计器中遇到意外的呈现行为。 这些行为仅影响函数的可见性,而不影响其效果,除非你编辑函数的参数值,这样会从代码中删除函数及其效果。 有关详细信息,请参阅 Base64 编码和解码。
base64ToString('<value>')
例如,使用返回图像或视频文件的 HTTP 操作。 可使用 binary()
将该值转换为 base-64 编码的内容信封模型。 然后,你可以在其他操作(例如 Compose
)中重复使用内容信封。
你可以使用此函数表达式发送请求中带有 application/octet-stream
内容类型的字符串字节。
返回操作在运行时的 body
输出。 actions('<actionName>').outputs.body
的速记。 请参阅 actionBody() 和 actions()。
body('<actionName>')
"UserName": "ContosoInc",
"FollowersCount": 172,
"Description": "Leading the way in transforming the digital workplace.",
"StatusesCount": 93,
"FriendsCount": 126,
"FavouritesCount": 46,
"ProfileImageUrl": "https://pbs.twimg.com/profile_images/908820389907722240/gG9zaHcd_400x400.jpg"
返回值的布尔版本。
bool(<value>)
chunk(createArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 5)
并返回以下结果:[ [1,2,3,4,5], [6,7,8,9,10], [11,12] ]
coalesce
返回一个或多个参数中的第一个非 null 值。 空字符串、空数组和空对象不为 NULL。
coalesce(<object_1>, <object_2>, ...)
这些示例返回指定值中的第一个非 null 值,当所有值均为 null 时返回 null:
coalesce(null, true, false)
coalesce(null, 'hello', 'world')
coalesce(null, null, null)
并返回以下结果:
第一个示例:true
第二个示例:"hello"
第三个示例:null
concat
组合两个或更多字符串,并返回组合后的字符串。
concat('<text1>', '<text2>', ...)
Azure 逻辑应用会自动或隐式执行 base64 编码和解码,因此,当你对需要编码或解码的数据使用 concat()
函数时,无需手动执行这些转换:
concat('data:;base64,',<value>)
concat('data:,',encodeUriComponent(<value>))
但是,如果你仍然在设计器中使用此函数,则可能会在设计器中遇到意外的呈现行为。 这些行为仅影响函数的可见性,而不影响效果,除非你编辑函数的参数值,这样就会从代码中删除函数及其效果。 有关详细信息,请参阅 Base64 编码和解码。
此示例将字符串“Hello”和“World”组合到一起:
concat('Hello', 'World')
并返回以下结果:"HelloWorld"
contains
检查集合是否包含某个特定项。 当找到该项目时返回 true,找不到该项目时返回 false。 此函数区分大小写。
contains('<collection>', '<value>')
contains([<collection>], '<value>')
具体而言,此函数对以下集合类型起作用:
字符串,在其中查找子字符串
数组,在其中查找值
字典,在其中查找键
此示例将时间戳转换为指定的时区:
convertFromUtc('2018-01-01T08:00:00.0000000Z', 'Pacific Standard Time')
并返回以下结果:"2018-01-01T00:00:00.0000000"
此示例将时间戳转换为指定的时区和格式:
convertFromUtc('2018-01-01T08:00:00.0000000Z', 'Pacific Standard Time', 'D')
并返回以下结果:"Monday, January 1, 2018"
convertTimeZone
将时间戳从源时区转换为目标时区。
convertTimeZone('<timestamp>', '<sourceTimeZone>', '<destinationTimeZone>', '<format>'?)
此示例将源时区转换为目标时区:
convertTimeZone('2018-01-01T08:00:00.0000000Z', 'UTC', 'Pacific Standard Time')
并返回以下结果:"2018-01-01T00:00:00.0000000"
此示例将时区转换为指定的时区和格式:
convertTimeZone('2018-01-01T80:00:00.0000000Z', 'UTC', 'Pacific Standard Time', 'D')
并返回以下结果:"Monday, January 1, 2018"
convertToUtc
将时间戳从源时区转换为协调世界时 (UTC)。
convertToUtc('<timestamp>', '<sourceTimeZone>', '<format>'?)
convertToUtc('01/01/2018 00:00:00', 'Pacific Standard Time')
并返回以下结果:"2018-01-01T08:00:00.0000000Z"
此示例将时间戳转换为 UTC:
convertToUtc('01/01/2018 00:00:00', 'Pacific Standard Time', 'D')
并返回以下结果:"Monday, January 1, 2018"
createArray
从多个输入返回数组。
对于单输入数组,请参阅 array()。
createArray('<object1>', '<object2>', ...)
并返回以下结果:
"01100100011000010111010001100001001110100111010001100101011110000111010000101111011100000 1101100011000010110100101101110001110110110001101101000011000010111001001110011011001010111 0100001111010111010101110100011001100010110100111000001110110110001001100001011100110110010 10011011000110100001011000110000101000111010101100111001101100010010001110011100000111101"
dataUriToString
返回数据统一资源标识符 (URI) 的字符串版本。
dataUriToString('<value>')
Decimal
将字符串中的小数数作为小数数返回。 当你处理需要小数精度的数据时,也可以使用此函数作为逻辑比较函数和数学函数的输入。 若要在使用 decimal() 函数的结果时捕获并保持精度,请用字符串函数包装任何小数输出。 下面的示例显示了这种用法,如果将小数结果用作数字,可能会丢失精度。
在这个函数和 Azure Logic应用运行时的上下文中讨论的小数精度与 .NET 小数精度相同。
decimal('<value>')
此示例创建一个小数,然后将结果转换为字符串以保持精度:
string(decimal('1.2345678912312131')) // Returns "1.2345678912312131".
此示例对两个小数数字使用数学函数,并将结果用作数字:
add(decimal('1.2345678912312131'), decimal('1.2345678912312131')) // Returns 2.469135782462426.
此示例对两个小数数字使用数学函数,并将结果转换为字符串以保持精度:
string(add(decimal('1.2345678912312131'), decimal('1.2345678912312131'))) // Returns "2.4691357824624262".
decodeBase64(已弃用)
此函数已弃用,因此请改用 base64ToString()。
decodeDataUri
返回数据统一资源标识符 (URI) 的二进制版本。 请考虑使用 dataUriToBinary() 而非 decodeDataUri()
。 虽然这两个函数的工作方式相同,但首选 dataUriToBinary()
。
Azure 逻辑应用会自动或隐式执行 base64 编码和解码,因此你无需使用编码和解码函数手动执行这些转换。 但是,如果你仍然在设计器中使用这些函数,则可能会在设计器中遇到意外的呈现行为。 这些行为仅影响函数的可见性,而不影响其效果,除非你编辑函数的参数值,这样会从代码中删除函数及其效果。 有关详细信息,请参阅 Base64 编码和解码。
decodeDataUri('<value>')
并返回以下结果:
"01100100011000010111010001100001001110100111010001100101011110000111010000101111011100000 1101100011000010110100101101110001110110110001101101000011000010111001001110011011001010111 0100001111010111010101110100011001100010110100111000001110110110001001100001011100110110010 10011011000110100001011000110000101000111010101100111001101100010010001110011100000111101"
decodeUriComponent
返回一个字符串,并将其中的转义字符替换为解码后的版本。
decodeUriComponent('<value>')
encodeUriComponent
通过将 URL 不安全字符替换为转义字符来返回字符串的统一资源标识符 (URI) 编码版本。 请考虑使用 uriComponent() 而非 encodeUriComponent()
。 虽然这两个函数的工作方式相同,但首选 uriComponent()
。
Azure 逻辑应用会自动或隐式执行 base64 编码和解码,因此你无需使用编码和解码函数手动执行这些转换。 但是,如果你仍然在设计器中使用这些函数,则可能会在设计器中遇到意外的呈现行为。 这些行为仅影响函数的可见性,而不影响其效果,除非你编辑函数的参数值,这样会从代码中删除函数及其效果。 有关详细信息,请参阅 Base64 编码和解码。
encodeUriComponent('<value>')
FLOAT
将浮点数的字符串版本转换为实际的浮点数。 仅当将自定义参数传递给应用(例如,逻辑应用工作流或 Power Automate 流)时,才使用此函数。 若要转换以区域设置特定格式表示的浮点字符串,可以选择指定 RFC 4646 区域设置代码。
float('<value>', '<locale>'?)
一个数字格式字符串,它是单个格式说明符或自定义格式模式。 时间戳的默认格式为“o”(yyyy-MM-ddTHH:mm:ss.fffffffK),这符合 ISO 8601 标准并保留了时区信息。
<locale>
要使用的区域设置。 如果未指定,则默认值为 en-us
。 如果 locale 不是有效值,则会生成错误。
formatDateTime('03/15/2018') // Returns '2018-03-15T00:00:00.0000000'.
formatDateTime('03/15/2018 12:00:00', 'yyyy-MM-ddTHH:mm:ss') // Returns '2018-03-15T12:00:00'.
formatDateTime('01/31/2016', 'dddd MMMM d') // Returns 'Sunday January 31'.
formatDateTime('01/31/2016', 'dddd MMMM d', 'fr-fr') // Returns 'dimanche janvier 31'.
formatDateTime('01/31/2016', 'dddd MMMM d', 'fr-FR') // Returns 'dimanche janvier 31'.
formatDateTime('01/31/2016', 'dddd MMMM d', 'es-es') // Returns 'domingo enero 31'.
返回与操作的“表单数据”或“表单编码”输出中的键名称匹配的值组成的数组。
formDataMultiValues('<actionName>', '<key>')
此示例基于指定操作的表单数据或表单编码输出中的“Subject”键的值创建数组。
formDataMultiValues('Send_an_email', 'Subject')
并在数组中返回主题文本,例如:["Hello world"]
返回与操作的“表单数据”或“表单编码”输出中的键名称匹配的单个值。
如果此函数找到多个匹配项,此函数将引发错误。
formDataValue('<actionName>', '<key>')
一个复合格式字符串,指定要使用的格式。 有关支持的数字格式字符串,请参阅 number.ToString(<format>, <locale>)
支持的标准数字格式字符串。
<locale>
要使用的受 number.ToString(<format>, <locale>)
支持的区域设置。 如果未指定,则默认值为 en-us
。 如果 locale 不是有效值,则会生成错误。
假设你要设置数字 1234567890
的格式。 此示例将该数字的格式设置为字符串“1,234,567,890.00”。
formatNumber(1234567890, '0,0.00', 'en-us')
假设你要设置数字 1234567890
的格式。 此示例将该数字的格式设置为字符串“1.234.567.890,00”。
formatNumber(1234567890, '0,0.00', 'is-is')
假设你要设置数字 17.35
的格式。 此示例将该数字的格式设置为字符串“$17.35”。
formatNumber(17.35, 'C2')
假设你要设置数字 17.35
的格式。 此示例将该数字的格式设置为字符串“17,35 kr”。
formatNumber(17.35, 'C2', 'is-is')
getFutureTime
返回当前时间戳加上指定的时间单位。
getFutureTime(<interval>, <timeUnit>, <format>?)
假设当前时间戳是“2018-03-01T00:00:00.0000000Z”。
此示例加上 5 天,并将结果转换为“D”格式:
getFutureTime(5, 'Day', 'D')
并返回以下结果:"Tuesday, March 6, 2018"
getPastTime
返回当前时间戳减去指定的时间单位。
getPastTime(<interval>, <timeUnit>, <format>?)
检查第一个值是否大于或等于第二个值。
当第一个值大于或等于第二个值时返回 true,当第一个值小于第二个值时返回 false。
greaterOrEquals(<value>, <compareTo>)
greaterOrEquals('<value>', '<compareTo>')
isFloat
返回一个布尔值,该值指示字符串是否为浮点数。 默认情况下,此函数使用浮点格式的固定区域性。 若要标识以其他区域设置特定格式表示的浮点数,可以选择指定 RFC 4646 区域设置代码。
isFloat('<string>', '<locale>'?)
此示例创建一个计数器变量,在 Until 循环中每迭代一次该变量就会递增 1,直至计数器值达到 5。 此示例还创建一个变量,用于跟踪每次迭代的当前索引。 在 Until 循环的每次迭代时,此示例会递增计数器值,然后将该值指定给当前索引值,然后再递增计数器值。 在此循环中,此示例使用 iterationIndexes
函数引用当前迭代索引:
iterationIndexes('Until_Max_Increment')
"actions": {
"Create_counter_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
"name": "myCounter",
"type": "Integer",
"value": 0
"runAfter": {}
"Create_current_index_variable": {
"type": "InitializeVariable",
"inputs": {
"variables": [
"name": "myCurrentLoopIndex",
"type": "Integer",
"value": 0
"runAfter": {
"Create_counter_variable": [ "Succeeded" ]
"Until_Max_Increment": {
"type": "Until",
"actions": {
"Assign_current_index_to_counter": {
"type": "SetVariable",
"inputs": {
"name": "myCurrentLoopIndex",
"value": "@variables('myCounter')"
"runAfter": {
"Increment_variable": [ "Succeeded" ]
"Compose": {
"inputs": "'Current index: ' @{iterationIndexes('Until_Max_Increment')}",
"runAfter": {
"Assign_current_index_to_counter": [
"Succeeded"
"type": "Compose"
"Increment_variable": {
"type": "IncrementVariable",
"inputs": {
"name": "myCounter",
"value": 1
"runAfter": {}
"expression": "@equals(variables('myCounter'), 5)",
"limit": {
"count": 60,
"timeout": "PT1H"
"runAfter": {
"Create_current_index_variable": [ "Succeeded" ]
返回字符串或 XML 的 JavaScript 对象表示法 (JSON) 类型值、对象或对象数组。
json('<value>')
json(xml('value'))
如果不提供一个用于定义输出结构的 XML 架构,该函数可能会返回其结构与预期格式大不相同的结果,具体取决于输入。
这种行为使得此函数不适合用于输出必须符合妥善定义的协定的情况,例如,在业务关键型系统或解决方案中。
此示例使用 json()
和 xml()
函数将根元素中具有单个子元素的 XML 转换为该子元素的名为 person
的 JSON 对象:
json(xml('<?xml version="1.0"?> <root> <person id="1"> <name>Sophia Owen</name> <occupation>Engineer</occupation> </person> </root>'))
并返回以下结果:
"?xml": {
"@version": "1.0"
"root": {
"person": {
"@id": "1",
"name": "Sophia Owen",
"occupation": "Engineer"
此示例使用 json()
和 xml()
函数将根元素中具有多个子元素的 XML 转换为一个数组,其中包含这些子元素的名为 person
的 JSON 对象:
json(xml('<?xml version="1.0"?> <root> <person id="1"> <name>Sophia Owen</name> <occupation>Engineer</occupation> </person> <person id="2"> <name>John Doe</name> <occupation>Engineer</occupation> </person> </root>'))
并返回以下结果:
"?xml": {
"@version": "1.0"
"root": {
"person": [
"@id": "1",
"name": "Sophia Owen",
"occupation": "Engineer"
"@id": "2",
"name": "John Doe",
"occupation": "Engineer"
intersection
返回其中仅包含指定集合的共有项的一个集合。 某个项必须出现在传递给此函数的所有集合中才会出现在结果中。 如果一个或多个项具有相同的名称,则具有该名称的最后一项将出现在结果中。
intersection([<collection1>], [<collection2>], ...)
intersection('<collection1>', '<collection2>', ...)
此示例查找以下数组中的共有项:
intersection(createArray(1, 2, 3), createArray(101, 2, 1, 10), createArray(6, 8, 1, 2))
并返回“仅”包含这些项的数组:[1, 2]
返回一个字符串,它包含某个数组中的所有项并且以分隔符分隔每个字符。
join([<collection>], '<delimiter>')
此示例查找 hello world hello world
字符串中最后一次出现的 world
子字符串的起始索引值。 返回的结果为 18
:
lastIndexOf('hello world hello world', 'world')
此示例缺少子字符串参数,将返回 22
值,因为输入字符串 (23
) 减 1 后的值大于 0。
lastIndexOf('hello world hello world', '')
length
返回集合中的项数。
length('<collection>')
length([<collection>])
检查第一个值是否小于或等于第二个值。
当第一个值小于或等于第二个值时返回 true,当第一个值大时返回 false。
lessOrEquals(<value>, <compareTo>)
lessOrEquals('<value>', '<compareTo>')
listCallbackUrl
返回调用某个触发器或操作的“回调 URL”。 此函数仅对适用于 HttpWebhook 和 ApiConnectionWebhook 连接器类型的触发器和操作起作用,对 Manual、Recurrence、HTTP 和 APIConnection 类型不起作用。
listCallbackUrl()
此示例显示了此函数可能会返回的示例回调 URL:
"https://prod-01.westus.logic.azure.com:443/workflows/<*workflow-ID*>/triggers/manual/run?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=<*signature-ID*>"
返回列表中或包括两端数字在内的数组中的最大值。
max(<number1>, <number2>, ...)
max([<number1>, <number2>, ...])
nthIndexOf('123456789123465789', '1', 1) // Returns `0`.
nthIndexOf('123456789123465789', '1', 2) // Returns `9`.
nthIndexOf('123456789123465789', '12', 2) // Returns `9`.
nthIndexOf('123456789123465789', '6', 4) // Returns `-1`.
检查是否至少一个表达式为 true。 当至少一个表达式为 true 时返回 true,当所有表达式均为 false 时返回 false。
or(<expression1>, <expression2>, ...)
outputs
返回操作在运行时的输出。 应使用此函数,而不是 actionOutputs()
,后者在设计器中解析为 outputs()
。 虽然这两个函数的工作方式相同,但首选 outputs()
。
outputs('<actionName>')
"Pragma": "no-cache",
"Vary": "Accept-Encoding",
"x-ms-request-id": "a916ec8f52211265d98159adde2efe0b",
"X-Content-Type-Options": "nosniff",
"Timing-Allow-Origin": "*",
"Cache-Control": "no-cache",
"Date": "Mon, 09 Apr 2018 18:47:12 GMT",
"Set-Cookie": "ARRAffinity=b9400932367ab5e3b6802e3d6158afffb12fcde8666715f5a5fbd4142d0f0b7d;Path=/;HttpOnly;Domain=twitter-wus.azconn-wus.p.azurewebsites.net",
"X-AspNet-Version": "4.0.30319",
"X-Powered-By": "ASP.NET",
"Content-Type": "application/json; charset=utf-8",
"Expires": "-1",
"Content-Length": "339"
"body": {
"FullName": "Contoso Corporation",
"Location": "Generic Town, USA",
"Id": 283541717,
"UserName": "ContosoInc",
"FollowersCount": 172,
"Description": "Leading the way in transforming the digital workplace.",
"StatusesCount": 93,
"FriendsCount": 126,
"FavouritesCount": 46,
"ProfileImageUrl": "https://pbs.twimg.com/profile_images/908820389907722240/gG9zaHcd_400x400.jpg"
parameters
返回工作流定义中描述的参数的值。
parameters('<parameterName>')
parseDateTime('20/10/2014', 'fr-fr') // Returns '2014-10-20T00:00:00.0000000'.
parseDateTime('20 octobre 2010', 'fr-FR') // Returns '2010-10-20T00:00:00.0000000'.
parseDateTime('martes 20 octubre 2020', 'es-es') // Returns '2020-10-20T00:00:00.0000000'.
parseDateTime('21052019', 'fr-fr', 'ddMMyyyy') // Returns '2019-05-21T00:00:00.0000000'.
parseDateTime('10/20/2014 15h', 'en-US', 'MM/dd/yyyy HH\h') // Returns '2014-10-20T15:00:00.0000000'.
返回指定范围(仅包括起端在内)中的一个随机整数。
rand(<minValue>, <maxValue>)
此示例从 JSON 对象(此对象通过 JSON() 函数从字符串转换为 JSON)中删除 middleName
属性,并返回更新后的对象:
removeProperty(json('{ "firstName": "Sophia", "middleName": "Anne", "surName": "Owen" }'), 'middleName')
下面是当前的 JSON 对象:
"firstName": "Sophia",
"middleName": "Anne",
"surName": "Owen"
下面是已更新的 JSON 对象:
"firstName": "Sophia",
"surName": "Owen"
此示例从 JSON 对象(此对象通过 JSON() 函数从字符串转换为 JSON)中的 customerName
父属性中删除 middleName
子属性,并返回更新后的对象:
removeProperty(json('{ "customerName": { "firstName": "Sophia", "middleName": "Anne", "surName": "Owen" } }')['customerName'], 'middleName')
下面是当前的 JSON 对象:
"customerName": {
"firstName": "Sophia",
"middleName": "Anne",
"surName": "Owen"
下面是已更新的 JSON 对象:
"customerName": {
"firstName": "Sophia",
"surName": "Owen"
replace
将子字符串替换为指定字符串,并返回结果字符串。 此函数区分大小写。
replace('<text>', '<oldText>', '<newText>')
此示例查找“the old string”中的“old”子字符串并将“old”替换为“new”:
replace('the old string', 'old', 'new')
并返回以下结果:"the new string"
result
返回指定的有范围操作(例如 For_each
、Until
或 Scope
操作)中顶级操作的结果。 result()
函数接受单个参数(范围的名称),并返回一个数组,其中包含该范围内的顶级操作中的信息。 这些操作对象包含的特性(例如操作的开始时间、结束时间、状态、输入、相关 ID 和输出)与 actions()
函数返回的特性相同。
此函数只返回有范围操作的第一级操作中的信息,而不返回更深层嵌套操作(例如切换或条件操作)中的信息。
例如,可以使用此函数获取失败操作的结果,以便可以诊断和处理异常。 有关详细信息,请参阅获取失败的上下文和结果。
result('<scopedActionName>')
"X-AspNetMvc-Version": "5.1",
"Access-Control-Allow-Origin": "*",
"Cache-Control": "private",
"Date": "Tue, 20 Aug 2019 22:15:37 GMT",
"Set-Cookie": "ARRAffinity=0285cfbea9f2ee7",
"Server": "Microsoft-IIS/10.0",
"X-AspNet-Version": "4.0.30319",
"X-Powered-By": "ASP.NET",
"Content-Length": "0"
"startTime": "2019-08-20T22:15:37.6919631Z",
"endTime": "2019-08-20T22:15:37.95762Z",
"trackingId": "6bad3015-0444-4ccd-a971-cbb0c99a7.....",
"clientTrackingId": "085863526764.....",
"code": "OK",
"status": "Succeeded"
"name": "HTTP",
"inputs": {
"uri": "https://httpstat.us/200",
"method": "GET"
"outputs": {
"statusCode": 200,
"headers": {
"X-AspNetMvc-Version": "5.1",
"Access-Control-Allow-Origin": "*",
"Cache-Control": "private",
"Date": "Tue, 20 Aug 2019 22:15:37 GMT",
"Set-Cookie": "ARRAffinity=0285cfbea9f2ee7",
"Server": "Microsoft-IIS/10.0",
"X-AspNet-Version": "4.0.30319",
"X-Powered-By": "ASP.NET",
"Content-Length": "0"
"startTime": "2019-08-20T22:15:37.6919631Z",
"endTime": "2019-08-20T22:15:37.95762Z",
"trackingId": "9987e889-981b-41c5-aa27-f3e0e59bf69.....",
"clientTrackingId": "085863526764.....",
"code": "OK",
"status": "Succeeded"
reverse
反转集合中项的顺序。 将此函数与 sort() 配合使用时,可以按降序对集合进行排序。
reverse([<collection>])
setProperty
设置 JSON 对象的属性值并返回更新的对象。 如果尝试设置的属性不存在,则会为对象添加该属性。 若要添加新属性,请使用 addProperty() 函数。
setProperty(<object>, '<property>', <value>)
此示例在 JSON 对象中设置 surName
属性,可通过 JSON() 函数将其从字符串转换为 JSON。 该函数将指定的值分配给属性,并返回更新后的对象:
setProperty(json('{ "firstName": "Sophia", "surName": "Owen" }'), 'surName', 'Hartnett')
下面是当前的 JSON 对象:
"firstName": "Sophia",
"surName": "Owen"
下面是已更新的 JSON 对象:
"firstName": "Sophia",
"surName": "Hartnett"
此示例为 JSON 对象中的 customerName
父属性设置 surName
子属性,可通过 JSON() 函数将其从字符串转换为 JSON。 该函数将指定的值分配给属性,并返回更新后的对象:
setProperty(json('{ "customerName": { "firstName": "Sophia", "surName": "Owen" } }'), 'customerName', setProperty(json('{ "customerName": { "firstName": "Sophia", "surName": "Owen" } }')['customerName'], 'surName', 'Hartnett'))
下面是当前的 JSON 对象:
"customerName": {
"firstName": "Sophie",
"surName": "Owen"
下面是已更新的 JSON 对象:
"customerName": {
"firstName": "Sophie",
"surName": "Hartnett"
删除集合开头的项,并返回所有其他项。
skip([<collection>], <count>)
Integer
自从零开始的位置或值开始搜索子字符串
- 如果 startIndex 大于字符串长度,则返回空字符串。
- 如果 startIndex 为负数,则开始搜索索引值,该索引值是字符串长度和 startIndex 之和。
<endIndex>
Integer
自从零开始的位置或值结束搜索子字符串。 位于结束索引值处的字符不包含在搜索中。
- 如果 endIndex 未指定或大于字符串长度,则搜索到字符串的末尾。
- 如果 endIndex 为负,则结束搜索字符串长度和 endIndex 总和的索引值。
slice('Hello World', 2) // Returns 'llo World'.
slice('Hello World', 30) // Returns ''.
slice('Hello World', 10, 2) // Returns ''.
slice('Hello World', 0) // Returns 'Hello World'.
slice('Hello World', 2, 5) // Returns 'llo'.
slice('Hello World', 6, 20) // Returns 'World'.
slice('Hello World', -2) // Returns 'ld'.
slice('Hello World', 3, -1) // Returns 'lo Worl'.
slice('Hello World', 3, 3) // Returns ''.
对集合中的项进行排序。 可以使用包含简单类型的任何键对集合对象进行排序。
sort([<collection>], <sortBy>?)
此示例按键对对象数组进行排序:
sort(createArray(json('{ "first": "Amalie", "last": "Rose" }'), json('{ "first": "Elise", "last": "Renee" }'), "last")
并返回此数组:[{ "first": "Elise", "last": "Renee" }, {"first": "Amalie", "last": "Rose" }')]
split
根据原始字符串中指定的分隔符字符,返回一个包含子字符串(以逗号分隔)的数组。
split('<text>', '<delimiter>')
确保 startIndex 与 length 参数值相加后的总和小于你为 text 参数提供的字符串长度。
否则会收到错误,这不同于其他语言中的类似函数,其结果是从 startIndex 到字符串末尾的子字符串。
length 参数是可选的,如果不提供此参数,substring() 函数将取从 startIndex 开始到字符串末尾的所有字符。
subtractFromTime('2018-01-02T00:00:00Z', 1, 'Day')
并返回以下结果:"2018-01-01T00:00:00.0000000Z"
此示例从以下时间戳中减去 1 天:
subtractFromTime('2018-01-02T00:00:00Z', 1, 'Day', 'D')
并使用可选的“D”格式返回以下结果:"Monday, January, 1, 2018"
返回集合开头的项。
take('<collection>', <count>)
take([<collection>], <count>)
ticks
返回自 0001 年 1 月 1 日午夜 12:00:00(或 C# 中的 DateTime.Ticks)到指定时间戳的间隔为 100 毫微秒的时钟周期数。 有关详细信息,请参阅此主题:DateTime.Ticks 属性(系统)。
ticks('<timestamp>')
triggerFormDataMultiValues('feedUrl')
并将以下数组返回为示例结果:["https://feeds.a.dj.com/rss/RSSMarketsMain.xml"]
返回一个字符串,其中包含与触发器的“表单数据”或“表单编码”输出中的键名称匹配的单个值。 如果此函数找到多个匹配项,此函数将引发错误。
triggerFormDataValue('<key>')
triggerFormDataValue('feedUrl')
并将以下字符串返回为示例结果:"https://feeds.a.dj.com/rss/RSSMarketsMain.xml"
triggerMultipartBody
返回具有多个部分的触发器输出中某个特定部分的正文。
triggerMultipartBody(<index>)
union
返回一个集合,其中包含指定集合中的所有项。 某个项只要出现在传递给此函数的任一集合中便会出现在结果中。 如果一个或多个项具有相同的名称,则具有该名称的最后一项将出现在结果中。
union('<collection1>', '<collection2>', ...)
union([<collection1>], [<collection2>], ...)
uriComponent
通过将 URL 不安全字符替换为转义字符来返回字符串的统一资源标识符 (URI) 编码版本。 请使用此函数而非 encodeUriComponent()。 虽然这两个函数的工作方式相同,但首选 uriComponent()
。
uriComponent('<value>')
并返回以下结果:
"001000100110100001110100011101000111000000100101001100 11010000010010010100110010010001100010010100110010010001 10011000110110111101101110011101000110111101110011011011 110010111001100011011011110110110100100010"
uriComponentToString
返回统一资源标识符 (URI) 编码字符串的字符串版本,有效地对 URI 编码字符串进行解码。
uriComponentToString('<value>')
uriPath('https://www.contoso.com/catalog/shownew.htm?date=today')
并返回以下结果:"/catalog/shownew.htm"
uriPathAndQuery
返回统一资源标识符 (URI) 的 path
和 query
值。
uriPathAndQuery('<uri>')
此示例查找以下 URI 的 path
和 query
值:
uriPathAndQuery('https://www.contoso.com/catalog/shownew.htm?date=today')
并返回以下结果:"/catalog/shownew.htm?date=today"
uriPort
返回统一资源标识符 (URI) 的 port
值。
uriPort('<uri>')
此示例查找以下 URI 的 query
值:
uriQuery('https://www.contoso.com/catalog/shownew.htm?date=today')
并返回以下结果:"?date=today"
uriScheme
返回统一资源标识符 (URI) 的 scheme
值。
uriScheme('<uri>')
此示例查找以下 URI 的 scheme
值:
uriScheme('https://www.contoso.com/catalog/shownew.htm?date=today')
并返回以下结果:"http"
utcNow
返回当前时间戳。
utcNow('<format>')
另外,也可以使用 <format> 参数指定不同的格式。
需要获取其值的工作流属性的名称
默认情况下,工作流对象具有以下属性:name
、type
、id
、location
、run
和 tags
。
- run
属性值是包含以下属性的 JSON 对象:name
、type
和 id
。
- tags
属性是一个 JSON 对象,其中包含与 Azure 逻辑应用中的逻辑应用或者 Power Automate 中的流关联的标记,以及这些标记的值。 有关 Azure 资源中的标记的详细信息,请查看在 Azure 中标记资源、资源组和订阅以对其进行逻辑有序的组织。
注意:默认情况下,逻辑应用没有标记,但 Power Automate 流具有 flowDisplayName
和 environmentName
标记。
workflow().run.name
如果使用 Power Automate,可以创建一个使用 tags
输出属性从流的 flowDisplayName
或 environmentName
属性获取值的 @workflow()
表达式。
例如,可以从流本身发送链接回到你的流的自定义电子邮件通知。 这些通知可以包含一个 HTML 链接,其中包含流在电子邮件标题中的显示名称。该链接遵循以下语法:
<a href=https://flow.microsoft.com/manage/environments/@{workflow()['tags']['environmentName']}/flows/@{workflow()['name']}/details>Open flow @{workflow()['tags']['flowDisplayName']}</a>
返回包含 JSON 对象的字符串的 XML 版本。
xml('<value>')
此示例创建包含以下 JSON 对象的字符串的 XML:
xml(json('{"person": {"name": "Sophia Owen", "city": "Seattle"}}'))
并返回以下结果 XML:
<person>
<name>Sophia Owen</name>
<city>Seattle</city>
<person>
xpath
检查 XML 中是否存在与 XPath(XML 路径语言)表达式匹配的节点或值,并返回匹配的节点或值。 XPath 表达式或单纯的“XPath”有助于在 XML 文档结构中导航,以便可以在 XML 内容中选择节点或计算值。
xpath('<xml>', '<xpath>')
</produce>
此示例传入 XPath 表达式 '/produce/item/name'
,以查找与 'items'
XML 字符串中的 <name></name>
节点匹配的节点,并返回包含这些节点值的数组:
xpath(xml(parameters('items')), '/produce/item/name')
此示例还使用 parameters() 函数从 'items'
获取 XML 字符串,并使用 xml() 函数将该字符串转换为 XML 格式。
下面是结果数组,其中包含与 <name></name
匹配的节点:
[ <name>Gala</name>, <name>Honeycrisp</name> ]
此示例是示例 1 的延续,它传入 XPath 表达式 '/produce/item/name[1]'
来查找作为 item
元素的子级的第一个 name
元素。
xpath(xml(parameters('items')), '/produce/item/name[1]')
结果如下:Gala
此示例是示例 1 的延续,它传入 XPath 表达式 '/produce/item/name[last()]'
来查找作为 item
元素的子级的最后一个 name
元素。
xpath(xml(parameters('items')), '/produce/item/name[last()]')
结果如下:Honeycrisp
此示例假设 items
XML 字符串还包含特性 expired='true'
和 expired='false'
:
<?xml version="1.0"?>
<produce>
<name expired='true'>Gala</name>
<type>apple</type>
<count>20</count>
</item>
<name expired='false'>Honeycrisp</name>
<type>apple</type>
<count>10</count>
</item>
</produce>
此示例传入 XPath 表达式 '//name[@expired]'
来查找具有 expired
特性的所有 name
元素:
xpath(xml(parameters('items')), '//name[@expired]')
结果如下:[ Gala, Honeycrisp ]
此示例假设 items
XML 字符串只包含特性 expired = 'true'
:
<?xml version="1.0"?>
<produce>
<name expired='true'>Gala</name>
<type>apple</type>
<count>20</count>
</item>
<name>Honeycrisp</name>
<type>apple</type>
<count>10</count>
</item>
</produce>
此示例传入 XPath 表达式 '//name[@expired = 'true']'
来查找具有 expired = 'true'
特性的所有 name
元素:
xpath(xml(parameters('items')), '//name[@expired = 'true']')
结果如下:[ Gala ]
此示例假设 items
XML 字符串还包含以下特性:
expired='true' price='12'
expired='false' price='40'
<?xml version="1.0"?>
<produce>
<name expired='true' price='12'>Gala</name>
<type>apple</type>
<count>20</count>
</item>
<name expired='false' price='40'>Honeycrisp</name>
<type>apple</type>
<count>10</count>
</item>
</produce>
此示例传入 XPath 表达式 '//name[@price>35]'
来查找具有 price > 35
的所有 name
元素:
xpath(xml(parameters('items')), '//name[@price>35]')
结果如下:Honeycrisp
此示例假设 items
XML 字符串与示例 1 中的字符串相同:
<?xml version="1.0"?>
<produce>
<name>Gala</name>
<type>apple</type>
<count>20</count>
</item>
<name>Honeycrisp</name>
<type>apple</type>
<count>10</count>
</item>
</produce>
此示例查找与 <count></count>
节点匹配的节点并通过 sum()
函数添加这些节点值:
xpath(xml(parameters('items')), 'sum(/produce/item/count)')
结果如下:30
此示例假设你有以下 XML 字符串,其中包含 XML 文档命名空间 xmlns="https://contoso.com"
:
<?xml version="1.0"?><file xmlns="https://contoso.com"><location>Paris</location></file>
这些表达式使用 XPath 表达式 /*[name()="file"]/*[name()="location"]
或 /*[local-name()="file" and namespace-uri()="https://contoso.com"]/*[local-name()="location"]
来查找与 <location></location>
节点匹配的节点。 这些示例演示了在设计器或表达式编辑器中使用的语法:
xpath(xml(body('Http')), '/*[name()="file"]/*[name()="location"]')
xpath(xml(body('Http')), '/*[local-name()="file" and namespace-uri()="https://contoso.com"]/*[local-name()="location"]')
下面是与 <location></location>
节点匹配的结果节点:
<location xmlns="https://contoso.com">Paris</location>
如果在代码视图中操作,请使用反斜杠字符 (\) 来转义双引号 (")。
例如,将表达式序列化为 JSON 字符串时,需要使用转义符。
但是,如果在设计器或表达式编辑器中操作,则无需转义双引号,因为系统会自动将反斜杠字符添加到基础定义中,例如:
代码视图:xpath(xml(body('Http')), '/*[name()=\"file\"]/*[name()=\"location\"]')
表达式编辑器:xpath(xml(body('Http')), '/*[name()="file"]/*[name()="location"]')
此示例是示例 8 的延续,它使用 XPath 表达式 'string(/*[name()="file"]/*[name()="location"])'
来查找 <location></location>
节点中的值:
xpath(xml(body('Http')), 'string(/*[name()="file"]/*[name()="location"])')
结果如下:Paris
了解工作流定义语言