Примечание : $(System.DefaultWorkingDirectory)
в вопросе: Azure Макрос конвейера (переменный), расширенный Azure перед PowerShell видит команду - ее не следует путать с собственным оператором подвыражения PowerShell , $(...)
.
Ответ Шайки Абрамчика обеспечивает эффективное решение, но позвольте мне предоставить некоторую справочную информацию :
Расширение (замена) значения , которое Azure выполняет с помощью макроса $(...)
, работает как препроцессор: оно заменяет указанное свойство на дословное значение .
Необходимо убедиться, что это дословное значение работает синтаксически в контексте целевой команды .
Как написано в настоящее время:
$SourceDirectoryPath = $(System.DefaultWorkingDirectory) + "/solution/project/bin/Debug"
превращается в следующую команду , видимую PowerShell , предполагая, что значение Azure свойство System.DefaultWorkingDirectory
равно d:\a\r1\a'
:
$SourceDirectoryPath = d:\a\r1\a + "/solution/project/bin/Debug"
Это сломано n Команда PowerShell, поскольку d:\a\r1\a
- из-за отсутствия цитирования - интерпретируется как имя команды или путь ; то есть сделана попытка выполнить предполагаемого исполняемого файла d:\a\r1\a
- см. about_Parsing
.
Следовательно, , чтобы PowerShell мог распознать Azure - расширенное значение d:\a\r1\a
в виде строки , вам нужно указать это - см. about_Quoting_Rules
.
Поскольку значение расширенного на Azure не требует дальнейшей интерполяции, одинарные кавычки являются лучшим выбором (фактически для обоих операндов):
$SourceDirectoryPath = '$(System.DefaultWorkingDirectory)' + '/solution/project/bin/Debug'
На самом деле, вам вообще не нужна конкатенация строк (+
) в вашем случае:
$SourceDirectoryPath = '$(System.DefaultWorkingDirectory)/solution/project/bin/Debug'
Вы можете даже комбинировать это с расширяемыми строками PowerShell ("..."
) ), если в Azure -расширенном значении отсутствуют $
-префиксированные токены, которые PowerShell может в итоге интерпретировать (если это не ваше (необычное) намерение).
One caveat что-то вроде "$(System.DefaultWorkingDirectory)/$projectRoot/bin/Debug"
(смешивание Azure -расширенного значения со ссылкой на переменную PowerShell) в том, что Azure * макрос синтаксис (* 10 95 *) выглядит так же, как собственный оператор подвыражения PowerShell , который обычно - но не исключительно - используется для встраивания выражений в расширяемые строки (например, в чистый PowerShell code, "1 + 1 equals $(1 + 1)"
).
На момент написания этой статьи Определить переменные Azure help topi c не прописывает это, а выдает официальный запрос комментарий в выпуске документации GitHub , устранена неоднозначность следующим образом :
Существует no механизм выхода; вместо этого конструкции $(...)
, которые не относятся к Azure переменным, оставлены без изменений и, следовательно, переданы через в PowerShell.
In в типичном случае выражения PowerShell не будут выглядеть как Azure ссылка на переменную (например, $($foo.bar)
, а не $(foo.bar)
), хотя гипотетически может быть неоднозначность: $(hostname)
, что является допустимым Подвыражение PowerShell может быть вытеснено Azure, если определена переменная hostname
Azure.
- В таком угловом случае решение состоит в том, чтобы избежать использования inline сценарий и вместо этого поместите код во внешний файл сценария .