Powershell (?) Очень странным образом преобразует аргумент - удаляет запятую из строки - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть шаг сборки PowerShell в TeamCity:

param ([string] $a)

Write-Host "`$a is '$a'."

, и на этом шаге я устанавливаю параметр $a как -a "%TestParam%" или "-a %TestParam%", где TestParam имеет две строки abra иcadabra.

Когда я запускаю сборку, я получаю следующий вывод:

[Step 1/10] PowerShell arguments: -NoProfile, NonInteractive, -ExecutionPolicy, ByPass, -File, C:\buildAgent\temp\buildTmp\powershell1746295357460795314.ps1, -a, "abra, cadabra"
[Step 1/10] $a is 'abra cadabra'.

Единственный вопрос, который у меня возникает: Что случилось с запятой? Почему он исчез?

Если я вообще не использую кавычки (-a %TestParam%), то TeamCity передает каждую строку как отдельный параметр, и я вижу $a is 'abra'..

1 Ответ

0 голосов
/ 24 сентября 2018

Ответ Матиаса Р. Джессена объясняет разбор PowerShell , разделенных токенов как аргументы [ с тех пор его ответ был удален, но я надеюсь, что он будет восстановлен ], ночто не применимо в данном случае , потому что любые аргументы, передаваемые в CLI PowerShell через -File, не подлежат синтаксическому анализу командной строки PowerShell - вместо этого такиеаргументы обрабатываются как литералы .

То есть если командная строка, вызванная TeamCity, действительно была следующей:

powershell ... -File C:\...ps1 -a "abra, cadabra"

тогда переменная параметра $a получит получит значение abra, cadabra, как и ожидалось.

Другими словами: Что такое на самом деле , передаваемое в вашем случаедолжно быть abra cadabra, а не
abra, cadabra, поэтому необходимо изменить значение %TestParam%, чтобы убедиться, что оно действительно содержит запятую .


Что касается , почему log вызванной команды предполагает, что* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1.] * 1. 1. 1.]]]1055 * Я подозреваю, что TeamCity является лжецом, показывая строки, соединенные запятой, но пропуская их без нее.

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

Если это действительно так, то аргумент "abra cadabra" - без запятой - будет записан как
"abra, cadabra", что объясняет путаницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...