Конкатенация строк PowerShell ведет себя по-разному внутри и вне функции - PullRequest
1 голос
/ 06 марта 2012

Я вижу действительно странное поведение в конкатенации строк в PowerShell. Сначала я использовал синтаксис "$var1: Hello" для замены строк, но затем переключился на простую конкатенацию с +, потому что она не работала. Теперь я замечаю, что используя одно и то же выражение присваивания, я получаю два разных результата.

Мне это кажется ошибочным, но я хочу убедиться, что я не делаю что-то не так.

function Test-Diff([string] $sRepoGUID, [string] $sChangeset1, [string] $sChangeset2){
  $url = $g_backendUrl + "repo/" + $sRepoGUID + "/diff/" + $sChangeset1 + ":" + $sChangeset2 + "?format=json&ignorews=True&maxsize=100000&timeout=10"
  Write-Output $url
}

$g_backendUrl = "http://localhost:56783/"
$sRepoGUID = '34CAA433-1600-469E-95B7-35CA0A0FECF4'
$sChangeset1 = '9d21e91b213a07e56d16a9b8fe519ad570d5c46e'
$sChangeset2 = '68269169cdd0b803d0e419752ce9cae627e589e5'
$url = $g_backendUrl + "repo/" + $sRepoGUID + "/diff/" + $sChangeset1 + ":" + $sChangeset2 + "?format=json&ignorews=True&maxsize=100000&timeout=10" 
Write-Output $url
Test-Diff($sRepoGUID, $sChangeset1, $sChangeset2)

, который пишет в консоль следующее:

http://localhost:56783/repo/34CAA433-1600-469E-95B7-35CA0A0FECF4/diff/9d21e91b213a07e56d16a9b8fe519ad570d5c46e:68269169cdd0b803d0e419752ce9cae627e589e5?format=json&ignorews=True&maxsize=100000&timeout=10
http://localhost:56783/repo/34CAA433-1600-469E-95B7-35CA0A0FECF4 9d21e91b213a07e56d16a9b8fe519ad570d5c46e 68269169cdd0b803d0e419752ce9cae627e589e5/diff/:?format=json&ignorews=True&maxsize=100000&timeout=10

Обратите внимание, что первая строка содержит /diff/ и : в правильном месте в строке. Вторая строка содержит пробелы, в которых /diff/ и : должны быть и вместо них добавляются /diff/ и : после последней объединенной переменной.

Я использовал одно и то же выражение $url = ... в обоих местах (я даже использовал копирование / вставку, чтобы быть уверенным).

Я нахожусь на Windows 7 x64 и проверил это на двух разных машинах.

Что может быть причиной такого поведения?

Ответы [ 2 ]

5 голосов
/ 06 марта 2012

Краткий ответ: Test-Diff $sRepoGUID $sChangeset1 $sChangeset2 - правильный синтаксис для передачи трех параметров.

Длинный ответ: ($sRepoGUID, $sChangeset1, $sChangeset2) - массив из трех элементов.Итак, когда вы вызываете Test-Diff ($sRepoGUID, $sChangeset1, $sChangeset2), вы на самом деле вызываете Test-Diff с одним параметром, который оказывается массивом, а не с тремя параметрами, которые вы намеревались передать.Итак, в выражении

$ g_backendUrl + "repo /" + $ sRepoGUID + "/ diff /" + $ sChangeset1 + ":" + $ sChangeset2 + "? Format = json & ignorews = True & maxsize = 100000 & timeout= 10 "

$sRepoGUID - это массив, который будет отображаться в строке как 34CAA433-1600-469E-95B7-35CA0A0FECF4 9d21e91b213a07e56d16a9b8fe519ad570d5c46e 68269169cdd0b803d0e419752ce9cae627e589e5, тогда как $sChangeset1 и $sChangeset2 равны нулю и не будут вносить какой-либо текст врезультирующая строка.

5 голосов
/ 06 марта 2012

Я думаю, проблема в том, как вы передаете аргументы своей функции. Посмотрите, работает ли это лучше:

Test-Diff $sRepoGUID $sChangeset1 $sChangeset2
...