Powershell:如何将对象数组转换为整数数组?

4
我使用以下命令创建一个对象数组,用于保存文件长度:
```

我使用以下命令创建一个对象数组,用于保存文件长度:

```
$lengths = dir -File | Sort-Object -Descending | Select-Object Length -First 5

然而,我希望这是一个整数数组,而不是对象数组,这样我就可以轻松地编辑值。如何将$lengths对象数组转换为整数数组?

谢谢!:)


1
展开属性,Select-Object -Expand Length。 如果需要,可以强制类型化变量 [int64[]] $lengths = ... - Santiago Squarzon
最常被问到的问题。还有 | foreach-object propertyname - js2010
你如何不改变对象的属性?在PowerShell中,每个东西都是一个对象,即使是整数或浮点数。 - phuclv
2个回答

4
答案已经在评论中给出,但为了结束讨论,您可以使用Select-Object -ExpandProperty来展开对象的值。值得注意的是,您的Sort-Object语句实际上并没有按照Length排序,除非你指定了要排序的属性:
$length = dir -File | Sort-Object Length -Descending | Select-Object -ExpandProperty Length -First 5

个人喜好扩展值,您可以使用ForEach-Object,在我看来语法更简单,但这里没有-First X

$length = dir -File | ForEach-Object Length | Sort-Object -Descending

$length 类型将会是 object[](对象数组),即使它包含一组 int64 值的数组,这是 PowerShell 中数组的默认类型。不过你可以通过 类型转换 或者 强类型 提供所需的输出类型。研究 转换运算符 [..] 是一个很好的起点。

# type casting
$length = [Int64[]] (dir -File | ....)

# hard typing
[Int64[]] $length = dir -File | ....

针对后者,$length受限于分配给int64值或可以被类型强制转换int64的值,即:

[int64[]] $length = 0..10

# can be assigned an `int32` and the array element will be converted to `int64`
$length = 1
$length[0].GetType() # => `int64`

# can be assigned a `string` which contains for example a decimal value
$length = '1.1', 2
# gets converted to int64 (no longer a decimal value)
$length[0] # => 1

# cannot be assigned a `string` which does not contain a type of numeric value
$length = 1, 'hello' # => ...Cannot convert value "hello" to type "System.Int64"...

虽然前者只强制数组元素的类型,但可以分配不同类型的新数组:

$length    = [int64[]] (0..10)
$length[0] = 'hello' # => ...Cannot convert value "hello" to type "System.Int64"...

$length = 'new', 'object', 'array' # succeeds

2
不错。小修正:当未指定属性时,“Sort-Object” 尝试使用默认排序属性(在此情况下为“Name”),如果没有默认排序属性,则逐个比较属性。https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/sort-object?view=powershell-7.2#notes - zett42

1

很遗憾,你不能使用Memeber Access Enumeration来获取Length,因为它也是集合的一个属性(与例如(gci -af).LastwriteTime不同)。但另一种获得所需数组的方法是:

$Length = (gci -af).Foreach({$_.Length}) | sort -Descending

没有进行强制转换的话,$Length 是通用对象数组:
PS > $Length.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]

但是它的所有元素都是相同类型的:

PS > ($Length | gm).TypeName | select -Unique
System.Int64

很好的点拨,解释了为什么在这种情况下无法进行成员访问枚举。 - Santiago Squarzon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接