我在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,并在两台不同的计算机上进行了测试。
导致此行为可能会发生什么?
答案 0 :(得分:5)
我认为问题在于你将参数传递给函数。看看这是否更好:
Test-Diff $sRepoGUID $sChangeset1 $sChangeset2
答案 1 :(得分:5)
简答: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
都是空的,并且不会向结果字符串。