PowerShell字符串连接在函数内部与外部行为有所不同

问题描述:

在PowerShell中,我看到字符串连接中出现了非常奇怪的行为。起初,我使用"$var1: Hello"语法进行字符串替换,但随后切换到与+简单级联,因为它不起作用。现在我注意到,使用完全相同的赋值表达式,我得到了两个不同的结果。PowerShell字符串连接在函数内部与外部行为有所不同

这对我来说是越野车,但我想确保我没有做错什么。

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上,并在两台不同的机器上测试过。

可能会发生什么情况导致此行为?

+1

http://stackoverflow.com/tags/powershell/info – manojlds 2012-03-06 21:39:49

+0

这个问题让我感到很开心。谢谢@manojlds – zionyx 2017-06-16 13:09:06

我认为问题在于你传递参数到你的函数的方式。看看这个效果是否更好:

Test-Diff $sRepoGUID $sChangeset1 $sChangeset2 
+0

当然!我不能相信我错过了这一点。当我使用逗号时,它将这些值连接为单个参数。 – 2012-03-06 19:11:35

简答:Test-Diff $sRepoGUID $sChangeset1 $sChangeset2是传递三个参数的正确语法。

长答案:($sRepoGUID, $sChangeset1, $sChangeset2)是一个由三个元素组成的数组。所以,当你打电话给Test-Diff ($sRepoGUID, $sChangeset1, $sChangeset2)时,你实际上调用了Test-Diff,这个参数恰好是一个数组,而不是你想传递的三个参数。因此,在表达

$ g_backendUrl + “回购/” + $ sRepoGUID + “/比较/” + $ sChangeset1 + “:” + $ sChangeset2 +”格式= JSON & ignorews =真& MAXSIZE = 100000 &超时= 10"

$sRepoGUID是一个数组,并且将被渲染到字符串作为34CAA433-1600-469E-95B7-35CA0A0FECF4 9d21e91b213a07e56d16a9b8fe519ad570d5c46e 68269169cdd0b803d0e419752ce9cae627e589e5,而$sChangeset1$sChangeset2和均为零,并且将不贡献任何文本到所得的字符串。