使用 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
我有一个文本文件,内容如下:
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