【问题标题】:Powershell string concatenation mysteryPowershell字符串连接之谜
【发布时间】:2021-07-25 08:00:46
【问题描述】:

我试图将一个变量与一个字符串连接起来,但中间总是有一个空格

[xml] $buildConfig = Get-Content $paths_target_file_path
$ver = $buildConfig.Project.PropertyGroup.LibVersion
$ver = $ver -replace "\s+",""
$version = "V"+$ver
Write-Host "Downloading LIB version: $version"

上面的输出是Downloading Lib version: V 1.2.11 即 V 和 1.2.11 之间的空格,尽管替换了任何空白字符

马库斯

【问题讨论】:

  • 您确定表观空间实际上是标准空间吗?还有其他看起来像空格的字符。一种测试方法是将$Ver 提供给Format-Hex 并查看实际的字符代码是什么。
  • @Lee_Dailey: \s 还涵盖了 ASCII 空格字符的 Unicode 变体。 (例如,(U+00A0,不间断空格)- 你知道有任何字符 呈现 像空格但与 \s 不匹配吗?Format-Hex 不是Windows PowerShell 中的选项,因为它表示任何非 ASCII 字符。如 3f== 文字 ?。在 PowerShell Core 中,它显示 构成非 UTF-8 编码的字节 ASCII 字符,可能会造成混淆。没有直接的内置解决方案;请参阅this answer
  • 我打赌$ver 不是字符串类型。
  • 不幸的是,在更改了我的 xml 文件后,我无法再重现它了 :-(。如果它再次出现,我会回来。谢谢

标签: string powershell concatenation


【解决方案1】:

这意味着$ver 包含一个字符串的数组,而不仅仅是一个字符串:

  • -replace operator 可以作为 LHS 对 arrays 进行操作,在这种情况下,该操作将应用于数组的 每个元素,并再次返回结果 作为一个数组。

  • 当 PowerShell stringifying 一个数组时 - 例如在使用 + 的显式字符串连接或在 expandable string ("...") 内隐式连接时 - 它使用 它们之间的空间

因此,您的症状意味着 $ver 不是单个字符串,而是一个 2 元素数组,其第一个元素是 空字符串

一个简单的演示:

$ver = ('', ' foo ') -replace '\s+'

'V' + $ver

以上内容逐字输出V foo

要使用$ver 数组的第一个非空元素,请使用以下内容:

'V' + ($ver -ne '')[0]  # -> 'Vfoo'

【讨论】:

  • 对,我认为如果 OP 尝试[string]$ver = $buildConfig.Project.PropertyGroup.LibVersion,他会看到预期的结果。类似于您示例中的$ver = [string]('', ' foo ') -replace '\s+'。很好的答案。
  • 谢谢@SantiagoSquarzon,但您的命令不会阻止空格。试试[string] $ver = '', 'foo'; "[$ver]"
  • 我明白你的意思,但$ver = [string]('', ' foo ') -replace '\s+' 给了我预期的结果,这就是为什么我认为从 OP 的问题$ver = [string]($buildConfig.Project.PropertyGroup.LibVersion) -replace '\s+' 也应该给出预期的结果。
  • @SantiagoSquarzon,但是,需要明确的是:从您的 first 评论来看,具有 type 约束 的版本将 not i> 工作,因为 [string] 演员然后应用之后 -replace 操作(回顾:[string] $ver = ('', 'foo') -replace '\s+'; "[$ver]"
  • 是的,您完全正确,从我的第一条评论来看,第一个示例行不通,后来我在尝试后意识到。