2012-03-06 28 views
1

在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

回答

5

我認爲問題在於你傳遞參數到你的函數的方式。看看這個效果是否更好:

Test-Diff $sRepoGUID $sChangeset1 $sChangeset2 
+0

當然!我不能相信我錯過了這一點。當我使用逗號時,它將這些值連接爲單個參數。 – 2012-03-06 19:11:35

4

簡答: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和均爲零,並且將不貢獻任何文本到所得的字符串。

相關問題