使用 Write-Host 时删除对象之间的 space

Remove space between objects when using Write-Host

我有一个文本文件,内容如下:

 Year= YYYY
 Month= MM

然后我读取文件,select我想要的行,拆分行所以我只得到“=”符号右边的内容,trim空白spaces,并使用以下代码将其全部放入一个变量中:

 $Year=Get-Content -Path .\test.txt | Where-Object {$_ -match 'Year='}
 $Year=($Year -Split 'Year=').trim()

针对我的每个设置(即年、月、日、时间)重复上述代码。

当我在命令提示符中输入 $Year 时,我得到 "YYYY"(无前导 space);但是当我使用 Write-Host 时,我得到“YYYY”(有一个前导 space)。

重要的是,出于文件路径和文件命名的原因,我能够将 $Year $Month 放在 eathother 旁边而不使用 space。 (即 .\YYYY\MM 或 YYYYMM.txt)。

我试过:

 Write-Host "Example: $Year$Month"
 Write-Host "Example: " $Year "\" $Month
 Write-Host ("Example: $($Year)$($Month)")
 Write-Host "Example: $Year\" + $Month"
 Write-Host "Example: $Year\" -f $Month"

 ....and several ways of implementing .trim() with no success.

如果问题不在 Write-Host 行,那么我唯一能想到的就是它必须与数据写入变量的方式有关。请记住,这只是一个例子,我的实际问题更大。这只是我需要完成的一个简单示例。

快速更新: 我找到了一个像这样的长期解决方法:

Write-Host "$Year\" -nonewline
Write-Host "$Month\".trim() -nonewline
Write-Host "$Day\".trim() -nonewline

但是必须有更好的方法来做到这一点。我在实际代码中使用了大约 8 个变量。所以给出 1 个文件名和路径的例子将是 8 行长......这将是愚蠢的。

问题是$Year -Split 'Year=' returns 2个元素,不仅仅是字符串after Year=.

立即修复是:

$Year = ($Year -Split 'Year=')[1].Trim()

更笼统地说,你可以这样写:

$Year = ($Year -split '=', 2)[1].Trim()

至于你试过的

如果 -split 运算符也在字符串的开头找到分隔符字符串,它假定 之前是 到 return 的子字符串,在本例中是 空字符串

在您的例子中,'Year= YYYY' -split 'Year=' 有效地生成数组 '', ' YYYY',并在其上调用 .Trim() 修剪单个元素,因此您最终得到 '', 'YYYY'

如果您通过 PowerShell 的 隐式输出 将其打印到控制台,您可以得到一个 空行 ,然后是 YYYY,这也是您使用 Write-Output $Year.

时会得到的结果

相比之下,如果您使用 Write-Host,PowerShell 通过将其元素与空格连接来对数组进行字符串化(默认情况下,可以使用 $OFS ), 所以你得到  YYYY.

换句话说:

PS> Write-Host ('', 'YYYY')
 YYYY  # concatenation of: empty string, space, 'YYYY'

默认情况下隐式等同于:

PS> Write-Host (('', 'YYYY') -join ' ')
 YYYY