Azure devops Azure Devops-无法在Powershell中设置变量
我有一个Azure Devops发布管道(使用经典编辑器而不是yaml),在内联powershell脚本中设置变量时遇到问题。脚本的相关部分如下所示:Azure devops Azure Devops-无法在Powershell中设置变量,azure-devops,Azure Devops,我有一个Azure Devops发布管道(使用经典编辑器而不是yaml),在内联powershell脚本中设置变量时遇到问题。脚本的相关部分如下所示: Write-Host "Web is $web" Write-Host "App is $app" Write-Host "##vso[task.setvariable variable=MyWebEnv;]$web" Write-Host "Set Web to $($My
Write-Host "Web is $web"
Write-Host "App is $app"
Write-Host "##vso[task.setvariable variable=MyWebEnv;]$web"
Write-Host "Set Web to $($MyWebEnv)"
Write-Host "##vso[task.setvariable variable=MyAppEnv;]$app"
Write-Host "Set App to $(MyAppEnv)"
日志文件表明my$web和$app变量具有正确的值,但是设置不起作用
我试着用$($env:MyWebEnv)和$(MyWebEnv)两种格式写出值,这两种格式都表明ADO变量设置不正确
我的变量在管道上的变量选项卡中定义。它被设置为可在队列时间设置。我尝试过在定义中没有设置值和初始值,我可以看到初始值没有被覆盖
我曾尝试在自托管代理和Azure管道托管代理上运行此操作-结果相同。我有另一个发布管道,它做了类似的事情,没有问题
我正在尝试在后续阶段使用该变量
我不想将变量写入文件或任何东西,因为我想使用变量来控制stage是否运行
编辑:
根据Levi的评论,我尝试添加isOutput=true,并在同一阶段的后续步骤中检查变量-即使在后续步骤中也不可见:
=========================================================================
编辑2:
我一定在什么地方有个不可见的角色。我在一个外部编辑器中编写powershell(这样我就有了更多的空间)并粘贴到ADO中的内联文本框中——当我在编辑器中输入与它开始工作时完全相同的内容时——有点像
我现在可以设置变量,它将出现在下面的任务中,但我真正想要的是在下一个阶段中使用它-在IIS部署组中控制IIS服务器A的运行,但IIS服务器B没有。我正在尝试在附加选项运行表达式中执行此操作
我试过了
和(succeed(),eq(变量['MyWebEnv'],'myvalue')
或者(其中MyOutput.是设置变量时为我的输出引用指定的名称)
和(succeed(),eq(变量['MyOutpub.MyWebEnv'],'myvalue')
或
和(succeed(),eq(变量['MyOutpub\u MyWebEnv'],'myvalue')
为了澄清,我是在IIS部署组本身上执行此操作的,而不是在该组中的任何任务上执行此操作
我一直看到由于以下原因而跳过部署:
评估:eq(变量['MyOutput,MyWebEnv'],'myvalue')扩展:eq(Null,'myvalue')结果:False
您试图在powershell任务中设置的变量将仅在以下任务中生效,这意味着如果您在自己的powershell任务中回显该变量,它将不会输出覆盖的值。请参阅
要从脚本中设置变量,请使用task.setvariable日志命令。这不会更新环境变量,但会使新变量可用于同一作业中的下游步骤
因此,您只能在下游任务中通过将其环绕在$()
周围来引用它。请参见以下内容:
steps:
- powershell: |
Write-Host "##vso[task.setvariable variable=MyWebEnv]$web"
- powershell: |
Write-Host "Set Web to $(MyWebEnv)"
如果要在后续阶段使用该变量,则必须使用isooutput=true
将该变量设置为输出变量。请参阅
您还应该为此powershell任务指定一个名称,以便在以下阶段中引用它。请参阅以了解如何引用多个阶段输出变量
variables:
web: $[stageDependencies.stageName.jobName.outputs['stepName.variableName']]
您还需要为以下阶段添加此阶段
请参见以下示例:
stages:
- stage: VariableStage
jobs:
- job: VariableJob
steps:
- powershell: |
$web = "---"
Write-Host "##vso[task.setvariable variable=MyWebEnv;isOutput=true]$web"
name: MyVariable
- stage:
dependsOn: VariableStage
variables:
web: $[stageDependencies.VariableStage.VariableJob.outputs['MyVariable.MyWebEnv']]
jobs:
- job:
steps:
- powershell: echo "$(web)"
您试图在powershell任务中设置的变量将仅在以下任务中生效,这意味着如果您在其自己的powershell任务中回显该变量,它将不会输出覆盖的值。请参阅 要从脚本中设置变量,请使用task.setvariable日志命令。这不会更新环境变量,但会使新变量可用于同一作业中的下游步骤 因此,您只能在下游任务中通过将其环绕在
$()
周围来引用它。请参见以下内容:
steps:
- powershell: |
Write-Host "##vso[task.setvariable variable=MyWebEnv]$web"
- powershell: |
Write-Host "Set Web to $(MyWebEnv)"
如果要在后续阶段使用该变量,则必须使用isooutput=true
将该变量设置为输出变量。请参阅
您还应该为此powershell任务指定一个名称,以便在以下阶段中引用它。请参阅以了解如何引用多个阶段输出变量
variables:
web: $[stageDependencies.stageName.jobName.outputs['stepName.variableName']]
您还需要为以下阶段添加此阶段
请参见以下示例:
stages:
- stage: VariableStage
jobs:
- job: VariableJob
steps:
- powershell: |
$web = "---"
Write-Host "##vso[task.setvariable variable=MyWebEnv;isOutput=true]$web"
name: MyVariable
- stage:
dependsOn: VariableStage
variables:
web: $[stageDependencies.VariableStage.VariableJob.outputs['MyVariable.MyWebEnv']]
jobs:
- job:
steps:
- powershell: echo "$(web)"
正如Levi Lu提到的,您可以在下一步中访问管道变量。因此,如果您在此处设置如下变量:
$web=“一些web”
$app=“某些应用程序”
写入主机“##vso[task.setvariable=MyWebEnv;]$web”
写入主机“##vso[task.setvariable=MyAppEnv;]$app”
然后你可以这样读:
Write Host“将Web设置为$(MyWebEnv)”
写入主机“将应用程序设置为$(MyAppEnv)”
如果要通过env变量访问它们,则应使用以下语法:
Write Host“将Web设置为$($env:MYWEBENV)”
写入主机“将应用程序设置为$($env:MYAPPENV)”
编辑2的答案:
您实际需要的是输出YAML中支持但经典管道中不支持的跨阶段变量。请检查此项。您可以克服此问题,但需要付出额外的努力,如图所示。但是,请记住,您不能从发布管道发布工件
您有用于跨阶段变量的文档,但如上所述,它适用于YAML。正如Levi Lu提到的,您可以在下一步中访问管道变量。因此,如果您在此处设置这样的变量:
$web=“一些web”
$app=“某些应用程序”
写入主机“##vso[task.setvariable=MyWebEnv;]$web”
写入主机“##vso[task.setvariable=MyAppEnv;]$app”
然后你可以这样读:
Write Host“将Web设置为$(MyWebEnv)”
写H