【问题标题】:how to concatenate two variables when one has spaces in it in AzureDevops batch fileAzureDevops批处理文件中有空格时如何连接两个变量
【发布时间】:2020-09-03 08:42:33
【问题描述】:

我的 ps 脚本中有这个输入。我正在传递$(Build.ArtifactStagingDirectory) 系统变量以获取输入%1 中的路径。路径有空格,即E:\Build Agents\Agent2\_work\15\a。我需要将它与其他路径连接,但我无法这样做。

set BuildDrop=%1
set Directory=%BuildDrop% + "\adapters\bin"

这是我的输出,这是不正确的,因为 Directory 应该类似于 E:\Build Agents\Agent2\_work\15\a\adapters\bin。如何解决?

set BuildDrop="E:\Build Agents\Agent2\_work\15\a" 

set Directory="E:\Build Agents\Agent2\_work\15\a" + "\adapters\bin" 

我的构建管道中的任务是这样的

Task         : Batch script
Description  : Run a Windows command or batch script and optionally allow it to change the environment
Version      : 1.1.10

【问题讨论】:

  • 呜呜呜?重击?珀尔?命令?
  • @AdminOfThings 是的,它是 powershell 和 azureDevops
  • @4c74356b41这是 bash。我已经更新了详细信息

标签: batch-file azure-devops azure-powershell


【解决方案1】:

我找到了解决方案。由于我的%1 有空间,我需要在分配之前删除撇号。我使用~ 变量来做到这一点。工作代码如下所示。

set "BuildDrop=%~1"
set "Directory=%BuildDrop%\adapters\bin"

【讨论】:

    【解决方案2】:

    你可以试试这个:

    set BuildDrop=%1
    set Directory= %BuildDrop%\adapters\bin
    echo %Directory%
    

    样本输出

    这是连接代码。

    %BuildDrop%\adapters\bin
    

    在上面的示例中,我尝试使用批处理脚本连接 C:\Users\svijay\Desktop\adapters\bin

    输出:C:\Users\svijay\Desktop\adapters\bin

    更新:

    @echo off 
    set BuildDrop=%1
    set Directory= %BuildDrop%\adapters\bin
    set Directory= %Directory:"=%
    echo %Directory%
    

    如果你有空间,你可以提供“”来提供输入。 在您的代码中,您可以删除双引号。

    %Directory:"=% - 从字符串文字中删除双引号。

    示例输出:

    【讨论】:

    • @mehul - 以上是批次。请让我知道这是否是您要找的那个?
    • 是的,但问题是BuildDrop="E:\Build Agents\Agent2\_work\15\a" 有撇号,它们也被连接起来。我不想要的。我需要一个撇号来读取包含空格的值。
    • BuildDrop=E:\Build Agents\Agent2_work\15\a ...不要给撇号。键入不带撇号的字符串。类似上面的例子
    • 如果您仔细查看我的示例输出。我没有给出撇号。输出只是 C:\Users\svijay\Desktop\adapters\bin
    • 是的,因为您的输入没有空间。试试word.bat C:\Users\s vijay\Desktop。我的输入文件夹有空间,因此需要一个撇号。
    【解决方案3】:

    您可以使用它来创建包含您的路径的 Azure DevOps 变量

    
    powershell: |
      
      $directory = $(Build.ArtifactStagingDirectory)                                                                                                                                                                                                                                                                                    
      $newDirectory = $directory + "\adapters\bin"
                                            
      Write-Host "##vso[task.setvariable variable=testvar]$newDirectory " 
    
    
    

    如果你需要在 powershell 脚本中设置变量

    $BuildDrop=$args[0]
    $Directory=$BuildDrop + "\adapters\bin"
    

    Here你有一篇文章如何在powershell中使用参数。

    【讨论】:

      【解决方案4】:

      我们可以在 Azure DevOps 中使用 powershell 任务来连接两个变量。 示例:

      Write-Host "Build.ArtifactStagingDirectory is $(Build.ArtifactStagingDirectory)"
      Write-Host "Build.ArtifactStagingDirectory is $(Build.ArtifactStagingDirectory)\adapters\bin"
      

      结果:

      另外,我找到了similar issue,也请查收。

      更新1

      在 Azure DevOps 管道中使用 power shell 脚本

      $testpath1 = "E:\Build Agents\Agent2\_work\15\a"
      $testpath2 = "\adapters\bin"
      Write-Host "path is $($testpath1)$($testpath2)"
      

      结果:

      使用本地电源外壳

      结果:

      更新2

      .bat 文件

      set testpath1=E:\Build Agents\Agent2\_work\15\a
      set testpath2=\adapters\bin
      set newpath=%testpath1%%testpath2%
      echo %newpath%
      

      流水线结果:

      【讨论】:

      • 如何设置变量值? Write-host 只会打印它。
      • 如果你想使用 Azure DevOps 变量,你应该使用日志命令Write-Host "##vso[task.setvariable variable=testvar;]testvalue"docs.microsoft.com/en-us/azure/devops/pipelines/scripts/…
      • 嗨@MehulParmar,我已经更新了答案,请检查一下。
      • @VitoLiu-MSFT 是的,这将打印出来。但是如何设置变量的值。我想改变变量Directory的值
      • @MehulParmar,您的意思是要更改环境变量 Build.ArtifactStagingDirectory 吗?或者在管道中添加一个新的环境变量?如果是,请查看answer
      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2018-01-23
      • 2018-03-25
      • 2010-12-14
      • 2012-03-10
      相关资源
      最近更新 更多