在VSTS上使用Azure CLI任务设置输出变量

9
我很疯狂,为了完成这个非常简单的任务。 我需要在Visual Studio Team Services上的Azure CLI任务中设置一个输出变量,因为下一个任务将根据该变量的值执行发布定义。
我编写了这个简单的代码。
call az extension add --name azure-cli-iot-ext
call echo ##vso[task.setvariable variable=iotEdgeExists;]$(az iot hub query -n $(iotHub) -q "select * from devices.modules where devices.deviceId ='$(iotEdge)'")

这段代码能够运行,但是效果不如预期。事实上,当我在下一个Azure CLI任务中读取输出变量并尝试在屏幕上打印时,我得到的是命令字符串而非输出结果...

call echo"$(az iot hub query -n <IOT_HUB> -q "select * from devices.modules where devices.deviceId ='<IOT_EDGE>'")"

我做错了什么?
4个回答

13

如果使用的是Azure CLI版本2,您可以使用PowerShell命令而不是批处理脚本魔法。请查看微软的 文档

例如,如果您需要访问令牌以更新Azure数据库,则应如下所示:

$token= & az account get-access-token --resource=https://database.windows.net --query accessToken
Write-Output("##vso[task.setvariable variable=sqlToken;]$token")

在本地测试时,请不要忘记先登录:

az login

在此安装 Azure 命令行界面


要访问Azure SQL,您需要使用--resource=https://database.windows.net/(即以斜杠结尾)。 - Matt Sullivan
@MattSullivan 这是不正确的,伙计。已经测试过带斜线和不带斜线的两种方式,都可以成功获取令牌。 - dwp4ge

10

请参考下面的代码:

call {your command}>tmpFile1
set /p myvar= < tmpFile1 
echo "##vso[task.setvariable variable=testvar;]%myvar%"
或者
FOR /F "tokens=* USEBACKQ" %%F IN (`{your command}`) DO (
SET var=%%F
)
echo "##vso[task.setvariable variable=testvar;]%var%"

Mechaflash在批处理文件中如何将命令输出设置为变量的问题中给出了答案。


预计跨平台会非常困难。 - riezebosch
当使用第二个命令时,似乎(在我的情况下)会在变量末尾添加一个额外的双引号。因此,我只需使用echo ##vso[task.setvariable variable=testvar;]%var% - Stef Heyenrath
通过第二种方法,我能够使用它来获取一个accessToken以连接到Azure SQL进行Dacpac部署,这正是我所需要的。我也遇到了@StefHeyenrath描述的问题,并不得不删除引号。对于那些寻求使用访问令牌进行Dacpac部署的人,只需在参数中传递/at:$(testvar)并将ConnectionString用作身份验证类型下拉菜单值即可。在您的连接字符串中,不要指定任何用户/密码或authentication=。 - CDerrig

1

受上面答案的启发,但有所变化。

截至2019年7月,在Microsoft DevOps中托管的Ubuntu代理上的Azure CLI任务中有效。

此示例运行az命令以获取存储帐户的完整资源名称,并将其设置为变量_StorageAccountNameVar,以在另一个管道任务中使用。

myvar=`az storage account list -g MyResourceGroup --query "[?contains(name, 'config')].name" -o tsv`
echo $myvar
echo "##vso[task.setvariable variable=_StorageAccountNameVar;]$myvar"

0

我遇到了一些问题(错误代码255)

相关。
    FOR /F “tokens=* USEBACKQ” %%F IN (`az account get-access-token --resource=https://database.windows.net/ -query accessToken`) DO (
SET var=%%F
)
echo ##vso[task.setvariable variable=sqlToken;]%var%

所以我使用了这个(并且对我有效)

for /f "tokens=1 USEBACKQ" %%F in (`az account get-access-token --resource=https://database.windows.net/ --query accessToken`) do echo ##vso[task.setvariable variable=sqltoken;]%%F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接