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