Термин «скрипт:» не распознается как имя командлета, функции, файла сценария или исполняемой программы

Я запускаю файл YAML конвейера сборки в Azure, где у меня есть сценарий PowerShell, который я хочу запустить, но я сталкиваюсь со следующей ошибкой:

script: : Термин «script:» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был включен путь, убедитесь, что путь указан правильно, и повторите попытку. В D:_work_temp\32585f841520.ps1:7 символ:3 сценарий:

CategoryInfo          : ObjectNotFound: (script::String) [], ParentContainsErrorRecordException
FullyQualifiedErrorId : CommandNotFoundException

и код приведен ниже:

steps:
- checkout: self
  submodules: true
- powershell: |
        $arr = Get-ChildItem '$(Build.SourcesDirectory)\Physical' |
        Where-Object {$_.PSIsContainer} |
        Foreach-Object {$_.Name}

            Write-Host "##vso[task.setvariable variable=arr;]$arr"
  displayName: 'Powershell Script'

- powershell: |
    $string = "$(arr)"
    $Data=$string.split(" ")
    foreach($item in $Data){
      script:
      C:\C:\location_of_build_agent.exe "$(Build.SourcesDirectory)\file_to_be_build" -c $item -buildMode "Rebuild"
      if (%errorlevel%==1) {exit 0} else {exit %errorlevel%}
      displayName: 'Run Build script for $item'
    }

Код должен передать список конфигураций из массива, который необходимо перестроить. Я также пытался запустить его в CmdLine, но безуспешно.


113
2

Ответы:

Решено

script: : Термин «script:» не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был включен путь, убедитесь, что путь указан правильно, и повторите попытку. В сценарии D:_work_temp\32585f841520.ps1:7 char:3:

Прямая причина в том, что вы помещаете script задачу внутрь powershell задачи. Ключевое слово script читается как command, но система не может его найти, после чего сообщается об ошибке.

В конвейере DevOps не поддерживается включение одной задачи в другую задачу.

Вы получаете folder name под Physical во 2-м PowerShell. задание, запустите location_of_build_agent.exe по папкам. Не знаю, что такое location_of_build_agent.exe.

Вот образец для справки, вы можете заменить Write-host $item на свою реальную команду (location_of_build_agent.exe...).

- powershell: |
    $arr = Get-ChildItem '$(Build.SourcesDirectory)\Physical' |
    Where-Object {$_.PSIsContainer} |
    Foreach-Object {$_.Name}
    
    Write-Host $arr            # check the value
    Write-Host "##vso[task.setvariable variable=arr;]$arr"
  displayName: 'Powershell Script'

- powershell: |
    $string = "$(arr)"
    $Data=$string.split(" ")
    foreach($item in $Data){
      Write-host $item
    }
  displayName: 'Run Build script'

У меня есть место, где есть еще папки, каждая папка — это конфигурация, я хочу иметь массив с именами папок (конфигураций), просмотреть их все и построить. если в эту папку добавляется новая конфигурация, нам не нужно обновлять код конвейера.

Сделать конвейер динамическим, чтобы его не требовалось обновлять при добавлении или удалении конфигурации, кажется полезным. Однако это может привести к ненужной сложности вашего кода или конвейера.

Итак, чтобы решить, насколько динамичным должен быть ваш конвейер, я думаю, самый важный вопрос:

  • Как часто конфигурации добавляются или удаляются?

Если конфигурации добавляются или удаляются часто (например, каждые несколько недель?), возможно, имеет смысл сделать что-то динамичное, как вы уже пытаетесь сделать (или использовать обходной путь Уэйда).

Но, с другой стороны, если конфигурации меняются не так часто (например, 3 или 4 раза в год?), подумайте о чем-то менее динамичном, но более простом для понимания и управления. Например, если ваш конвейер правильно структурирован, может быть достаточно просто обновить список конфигураций, определенных как параметр:

parameters:
  - name: configurations
    displayName: Configuration folders
    type: object
    default:
      - configA
      - configB
      - configC

steps:
  - ${{ each configuration in parameters.configurations }}:
    - script: |
        echo "Running build script for ${{ configuration }}"

        # other commands here
      displayName: 'Run build script for ${{ configuration }}'