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

Я запускаю файл 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, но безуспешно.

Вы не можете создать задачу конвейера динамически, т.е. е. при запуске самого трубопровода.

Rui Jarimba 04.07.2024 14:14

А другого способа запускать все конфигурации из локации без добавления конфига в код вручную нет?

Adrian 04.07.2024 14:32

Я пытаюсь разобраться в вашем коде, но ничего не понимаю. Не могли бы вы предоставить больше контекста, например, каков ваш сценарий? Каково содержимое массива? И что с этим делать?

Rui Jarimba 04.07.2024 14:42

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

Adrian 04.07.2024 15:34

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

wade zhou - MSFT 04.07.2024 15:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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'

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

Adrian 04.07.2024 16:06

Я протестировал код, и команда «Write-host $item» зацикливается правильно и показывает все конфигурации по этому пути, но по какой-то причине, если я добавляю свои команды внутрь, после первой сборки конфигурации она выходит из цикла. и продолжите выполнение остальных задач из конвейера. мои команды: 'C:\Automation\AS.PrepareBuild.exe C:\Automation\bin-en\AS.Build.exe "$(Build.SourcesDirectory)\Project.apj" -c $item -buildMode "Rebuild" if ($LastExitCode -eq 1) {выход 0} else {выход $LastExitCode}'

Adrian 05.07.2024 09:14

Спасибо @Adrian за комментарий. У вас есть {exit $LastExitCode} в выражении if, которое может завершить задачу для 1-й конфигурации, удалите его для проверки. Задача Powershell фактически автоматически проверяет код выхода: 1 на наличие сбоя и 0 на успех.

wade zhou - MSFT 05.07.2024 10:00

У меня есть несколько предупреждений при сборке некоторых конфигураций, и powershell думает, что это ошибки, и завершаю работу с кодом 1, по этой причине мне нужна эта небольшая логика if ($LastExitCode -eq 1) {exit 0} else {exit $LastExitCode}, но я понимаю, что эта логика должна находиться за пределами { } из foreach, чтобы продолжить цикл. и сразу после цикла до exitcode 0. Спасибо за ваш вклад.

Adrian 05.07.2024 10:38

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

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

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

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

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

Но, с другой стороны, если конфигурации меняются не так часто (например, 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 }}'

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

Adrian 05.07.2024 10:50

@Адриан, нет проблем. Во многих случаях просто не стоит жертвовать читабельностью и обслуживанием ради чего-то более динамичного.

Rui Jarimba 05.07.2024 11:53

Другие вопросы по теме

Похожие вопросы

Ошибка обнаружения текущей ветки: фатальный: ref HEAD не является символической ссылкой в ​​выпуске mvn — Azure Pipeline
Как настроить проверку утверждения конвейера Azure для развертывания в приложениях-функциях Azure?
Ошибка: невозможно зарегистрировать свойство «TestType» как тип значения «System.Guid», поскольку оно уже зарегистрировано как «System.String»
Использование API Azure Devops в Python для получения всех измененных файлов в PR
Измените обработку заданий с FIFO на LIFO
Почему я получаю сообщение об ошибке: Ошибка: шаблон файла шаблона соответствует каталогу, а не файлу: /home/vsts/work/1/s в моем файле конвейера файлов yaml?
Azure DevOps REST API: сопоставить шаги ручного тестового примера с результатами тестового запуска?
Не удалось завершить частичное восстановление нашей базы данных Azure DevOps
Переменные среды как параметр объекта типа в конвейерах Azure DevOps
Имя файла, начинающееся с .(точки), не отображается в конвейере Azure Devops