Powershell 在多个发布任务中设置和使用环境变量 问题

Powershell 在多个发布任务中设置和使用环境变量 问题,powershell,azure-devops,automated-tests,access-token,azure-devops-rest-api,Powershell,Azure Devops,Automated Tests,Access Token,Azure Devops Rest Api,如何将值从发布管道传递到测试程序集和控制台应用程序(.exe)?在这种特殊情况下,我需要传递测试程序集和控制台应用程序都使用的个人访问令牌(PAT),如下所示: string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken"); Write-Host ##vso[task.setvariable variable=appSettings_personalAccessTok

如何将值从发布管道传递到测试程序集和控制台应用程序(.exe)?在这种特殊情况下,我需要传递测试程序集和控制台应用程序都使用的个人访问令牌(PAT),如下所示:

string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken");
Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
我一直试图在一个特定任务中设置环境变量,但在其他任务中无法使用它

细节 我已经配置了一个发布管道,它运行一些集成测试,并运行一个执行控制台应用程序的powershell脚本:

集成测试和控制台应用程序都使用个人访问令牌(PAT)来访问Azure DevOps REST API。我从名为
appSettings\u personalAccessToken
的环境变量读取此值,该变量应在发布管道中设置

我试图在第一个任务(Powershell任务-内联脚本)中设置PAT,但在其他任务中它似乎被忽略了,我做错了什么

我尝试在powershell任务中设置PAT,如下所示:

string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken");
Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
或者像这样:

string token = Environment.GetEnvironmentVariable("appSettings_personalAccessToken");
Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
但在其他任务中,该值似乎被忽略。我错过了什么

编辑1 即使尝试设置powershell任务中硬编码的PAT也不起作用:

Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]MY_TOKEN_VALUE"

使用此命令时:

Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
您需要在数据周围加引号:

Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken"

否则,当您使用此命令时,PowerShell将看到
#
并对行的其余部分进行注释:

Write-Host ##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken
您需要在数据周围加引号:

Write-Host "##vso[task.setvariable variable=appSettings_personalAccessToken;isSecret=false;isOutput=true;]$personalAccessToken"

否则,PowerShell会看到
#
并对行的其余部分进行注释这里的问题是Windows不会在创建/更改或删除时自动刷新环境变量。 只有在重新启动
explorer.exe
进程后,或者在
我的电脑|属性|高级|环境变量

然后,浏览器向所有窗口广播一条
WM\u SETTINGCHANGE
消息,通知它们该更改。
但是,即使手动执行此操作,已经运行的进程也可能不会拾取更改,除非它们处理设置更改消息

如果重新启动资源管理器没有问题,您可以尝试:

[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
Stop-Process -ProcessName explorer
explorer.exe进程应自动重新启动。这由注册表
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
AutoRestartShell
值控制


希望有帮助。

这里的问题是Windows不会在创建/更改或删除时自动刷新环境变量。 只有在重新启动
explorer.exe
进程后,或者在
我的电脑|属性|高级|环境变量

然后,浏览器向所有窗口广播一条
WM\u SETTINGCHANGE
消息,通知它们该更改。
但是,即使手动执行此操作,已经运行的进程也可能不会拾取更改,除非它们处理设置更改消息

如果重新启动资源管理器没有问题,您可以尝试:

[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'User')
[Environment]::SetEnvironmentVariable('appSettings_personalAccessToken', $personalAccessToken, 'Machine')
Stop-Process -ProcessName explorer
explorer.exe进程应自动重新启动。这由注册表
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
AutoRestartShell
值控制


希望这会有所帮助。

您无需为此使用PAT。使用。您可以授予对系统提供的OAuth令牌的构建或发布访问权,然后在需要auth令牌的实例中引用该令牌


请注意,您需要这样做,否则这将不起作用。

您无需为此使用PAT。使用。您可以授予对系统提供的OAuth令牌的构建或发布访问权,然后在需要auth令牌的实例中引用该令牌


请注意,您需要这样做,否则这将不起作用。

我将在这里发布我的解决方案,希望它对可能有相同问题的其他人有用。谢谢@Matt和@Theo为我指明了正确的方向

我对发布变量的工作原理有错误的理解。我认为这些将仅在任务级别可用,而不适用于从发布管道执行的任何应用程序或测试程序集-这就是我尝试使用Powershell设置它们的原因

因此,解决方案非常简单-我删除了尝试设置环境变量的powershell任务,并按如下方式设置变量:


我将在这里发布我的解决方案,希望它对可能有相同问题的其他人有用。谢谢@Matt和@Theo为我指明了正确的方向

我对发布变量的工作原理有错误的理解。我认为这些将仅在任务级别可用,而不适用于从发布管道执行的任何应用程序或测试程序集-这就是我尝试使用Powershell设置它们的原因

因此,解决方案非常简单-我删除了尝试设置环境变量的powershell任务,并按如下方式设置变量:


使用SetEnvironmentVariable时可能是这样,但不应该是###vso命令的要求。@theo试图执行该命令,但我在尝试执行
停止进程
cmdlet时出错,可能生成代理没有在发布管道中执行该命令的权限。这也不起作用:对于使用SetEnvironmentVariable,这可能是正确的,但不应该是##vso命令的要求。@theo试图执行该命令,但我在尝试执行
Stop Process
cmdlet时出错,可能生成代理没有在发布管道中执行该命令的权限。这也不起作用:你完全正确-我以前确实有引用,但出于某种原因,我删除了它们(如图所示)。。。。不管怎样,我又试着放回引用,但没有成功:(@RuiJarimba在你的内联中)