如何将 Get-ChildItem 的一个结果存储为一个数组值?

Way*_*ton 5 powershell

我有一个名为 D:\MyDir 的文件夹,这是其内容:

PS D:\MyDir> gci


    Directory: D:\MyDir


Mode                LastWriteTime         Length Name
----                -------------         ------ ---- d-----       11/22/2021   8:10 PM                MyFolder-2021-11-22
Run Code Online (Sandbox Code Playgroud)

我将按 creatin 排序的文件夹名称存储在 $Dirlist 上:

$Dirlist = gci $LBDestination | ? { $_.PSIsContainer } | sort CreationTime | select -Property Name | foreach { $_.Name }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是系统将列表中的每个字母存储为数组中的一个值

PS D:\MyDir> $Dirlist[0..3]
M
y
F
o
Run Code Online (Sandbox Code Playgroud)

当我有多个文件夹时,我的脚本工作正常。

Sim*_*onS 10

这不是处理数据的好习惯format-listformat-list用于可视化输出。

相反,您应该告诉您的变量它肯定是一个数组,即使它只有一个值。您可以通过将其转换为 a[string[]]或将整个命令包装到其中@(),甚至在将其存储在变量中之前使其成为数组。

看看这里的区别:

如果有多个返回,您的方法就有效,因为那时它自动是一个数组。然而,如果只有一个返回,它就不起作用,因为 PowerShell 认为您希望变量是一个字符串,因为您没有明确告诉它您希望它是一个数组:

PS C:\Install\mydir> $Dirlist = gci . | ? { $_.PSIsContainer } | sort CreationTime | select -ExpandProperty Name
PS C:\Install\mydir> $Dirlist[0..3]
M
y
F
o
Run Code Online (Sandbox Code Playgroud)

您可以将其转换为数组,它将起作用:

PS C:\Install\mydir> [string[]]$Dirlist = gci . | ? { $_.PSIsContainer } | sort CreationTime | select -ExpandProperty Name
PS C:\Install\mydir> $Dirlist[0..3]
MyFolder-2021-11-22
Run Code Online (Sandbox Code Playgroud)

或者将整个命令包装在@()

PS C:\Install\mydir> $Dirlist = @(gci . | ? { $_.PSIsContainer } | sort CreationTime | select -ExpandProperty Name)
PS C:\Install\mydir> $Dirlist[0..3]
MyFolder-2021-11-22
Run Code Online (Sandbox Code Playgroud)

顺便提一句。代替

  • | select -Property Name | foreach { $_.Name }

只需使用

  • | select -ExpandProperty Name

  • @WayneHamilton `Format-List` 在这种情况下有效,因为您有单个字符串作为数组。但是,如果您有多个属性等,它将不再按您的预期工作。正如我所说,它用于可视化数据,仅供您查看,而不是用于处理和操作数据。如果你现在认为“哦,我可以‘fl’一切”,那将是一个坏习惯。因此,在这种情况下根本不要使用它,它根本不正确。我写的“select”更加优雅,因为它直接扩展属性,并且您不需要使用“foreach”迭代它。它的作用完全相同,但更优雅。 (2认同)