1

我有一个类似这样的文本文件:

 Year= YYYY
 Month= MM

然后我读入文件,选择我想要的行,拆分行,以便我只得到“=”符号右侧的内容,修剪空格,然后使用以下代码将其全部放入变量中:

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

对于我拥有的每个设置(即年、月、日、时间),都会重复上述代码。

当我将 $Year 放入命令提示符时,我得到“YYYY”(没有前导空格);但是当我使用 Write-Host 时,我得到“YYYY”(有一个前导空格)。

由于文件路径和文件命名原因,我能够将 $Year $Month 放在eathother 旁边,这一点很重要。(即 .\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 行长......这将是愚蠢的。

4

1 回答 1

2

问题是$Year -Split 'Year='返回2 个元素, 不仅仅是Year=.

立即修复将是:

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

更一般地说,你可以写:

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

至于你尝试了什么:

如果-split运算符也在字符串的最开头找到分隔符字符串,它假定它前面是要返回的第一个子字符串,在这种情况下是空字符串。

在您的情况下,'Year= YYYY' -split 'Year='有效地产生 array '', ' 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
于 2019-10-14T20:51:55.287 回答