Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure devops Azure Devops-无法在Powershell中设置变量_Azure Devops - Fatal编程技术网

Azure devops Azure Devops-无法在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

我有一个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 $($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