gpt4 book ai didi

powershell - 为什么 + 运算符在 powershell 中添加空格

转载 作者:行者123 更新时间:2023-12-02 22:57:24 25 4
gpt4 key购买 nike

我遇到了奇怪的问题。我有一个文件,内容如下

-----MyData-----
aaa
bbb
ccc
ddd
-----YourData-----

我写了一个函数来获取文件中除了第一行和最后一行之外的所有数据。函数如下

function readFile([string] $datapath){
$returningData = $null
foreach($line in [System.IO.File]::ReadLines($datapath)) {
if(-not ($line -like '*-MyData-*') -and -not ($line -like '*-YourData-*')){
$returningData+=$line
}
}
return $returningData
}

现在,此方法按预期返回“aaabbbcccddd”,但在 IF block 中,如果我使用 $returningData+$line 而不是我现在使用的 write,则它返回“aaa bbb ccc ddd”。

我找过它,但找不到任何答案。为什么简单的串联要添加一个额外的空格?

最佳答案

这里有两件事在起作用:

显示数据

PowerShell 显示和/或将对象(包括数组)转换为字符串的方式:

$MyData = 'aaa', 'bbb', 'ccc', 'ddd'

PS C:\> "$MyData"
aaa bbb ccc ddd

PS C:\> Write-Host $MyData
aaa bbb ccc ddd

或者从管道输出(展开):

PS C:\> $MyData # Simular to: $MyData | ForEach-Object { $_ }
aaa
bbb
ccc
ddd

另请注意,数组在字符串或输出中被展平(参见例如:Why does PowerShell flatten arrays automatically?)

为了更好地显示对象及其结构,您可以考虑使用 serializer , 比如 ConvertTo-Json :

PS C:\> ConvertTo-Json $MyData
[
"aaa",
"bbb",
"ccc",
"ddd"
]

ConvertTo-Expression对于更复杂的对象,例如:

$MyObject = 'aaa', @([datetime]'1963-10-07', [version]'1.2.3'), 'bbb'

PS C:\> Write-Host $MyObject
aaa 10/7/1963 12:00:00 AM 1.2.3 bbb

PS C:\> ConvertTo-Expression $MyObject
'aaa',
(
[datetime]'1963-10-07T00:00:00.0000000',
[version]'1.2.3'
),
'bbb'

类型转换

这里发挥作用的另一件事是自动 type casting当用作运算符的操作数时,对象被隐式转换为相同类型。这意味着如果操作数的类型不同,则第一个操作数的类型将用于运算,第二个操作数将转换为与第一个操作数相同的类型(如果可能)。

这对 很重要 comparison operators :

PS C:\> 10 -gt '9' # 10 > 9
True

PS C:\> '10' -gt 9 # '10' < '9'
False

和大多数其他operators包括 arithmetic operators :

PS C:\> 10 + '9' # Results in a integer: 10 + 9
19

PS C:\> '10' + 9 # Results in a string: '10' + '9'
109

还有在数组的情况下:

PS C:\> 'aaa' + 'bbb', 'ccc' # Results in a string: 'aaa' + 'bbb ccc'
aaabbb ccc

PS C:\> 'aaa', 'bbb' + 'ccc' # Results in an array: 'aaa', 'bbb' + @('ccc')
aaa
bbb
ccc

如果第一个操作数是$Null(不属于任何数据类型),则使用第二个操作数的类型:

PS C:\> $a = $Null + 'aaa'
PS C:\> $a.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object

PS C:\> $a = $Null + @('aaa')
PS C:\> $a.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

结论

改变你的线路:

$returningData = $null

到:

$returningData = @()

或:

$returningData = ''

在这件事上很可能会给你不同的结果。

注意:using the increase assignment operator (+=) to create an object collection 一样,您通常应该避免使用增加赋值运算符 (+=) 来构建字符串,因为它的成本呈指数级增长。

相反,我建议您使用管道和 -Join构建字符串的运算符:

PS C:\> $MyData -Join ''
aaabbbcccddd

或者在你的脚本中:

$returningData = @(
foreach($line in $MyData) {
if(-not ($line -like '*a*') -and -not ($line -like '*b*')){ $line }
}
) -Join ''

关于powershell - 为什么 + 运算符在 powershell 中添加空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62587613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com