【问题标题】:PowerShell string concatenation behaves differently inside vs. outside a functionPowerShell 字符串连接在函数内部和外部的行为不同
【发布时间】:2017-06-17 16:15:02
【问题描述】:

我在 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,并已在两台不同的机器上进行了测试。

可能会发生什么导致这种行为?

【问题讨论】:

标签: string powershell string-concatenation


【解决方案1】:

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

Test-Diff $sRepoGUID $sChangeset1 $sChangeset2

【讨论】:

  • 当然!我不敢相信我错过了。当我使用逗号时,它将值连接为单个参数。
【解决方案2】:

简答: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 都是空的,并且不会向结果字符串提供任何文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多