这里有两件事在起作用:
显示数据
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 一样,您通常应避免使用递增赋值运算符 (+=) 来构建字符串,因为它的代价是指数级的。 p>
相反,我建议您使用管道和-Join 运算符来构建字符串:
PS C:\> $MyData -Join ''
aaabbbcccddd
或者在你的脚本中:
$returningData = @(
foreach($line in $MyData) {
if(-not ($line -like '*a*') -and -not ($line -like '*b*')){ $line }
}
) -Join ''