我有一个名为 D:\MyDir 的文件夹,其内容如下:
PS D:\MyDir> gci
Directory: D:\MyDir
Mode LastWriteTime Length Name
---- ------------- ------ ---- d----- 11/22/2021 8:10 PM MyFolder-2021-11-22
我将按创建顺序排列的文件夹名称存储在 $Dirlist 中:
$Dirlist = gci $LBDestination | ? { $_.PSIsContainer } | sort CreationTime | select -Property Name | foreach { $_.Name }
我遇到的问题是系统将列表中的每个字母存储为数组中的一个值
PS D:\MyDir> $Dirlist[0..3]
M
y
F
o
当我有多个文件夹时,我的脚本运行良好。
答案1
这不是一个用于format-list
处理数据的好习惯。format-list
用于可视化输出。
相反,你应该告诉你的变量它肯定是一个数组,即使它只有一个值。你可以将它强制转换为一个,[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
您可以将其转换为数组并且它会起作用:
PS C:\Install\mydir> [string[]]$Dirlist = gci . | ? { $_.PSIsContainer } | sort CreationTime | select -ExpandProperty Name
PS C:\Install\mydir> $Dirlist[0..3]
MyFolder-2021-11-22
或者将整个命令包装在@()
:
PS C:\Install\mydir> $Dirlist = @(gci . | ? { $_.PSIsContainer } | sort CreationTime | select -ExpandProperty Name)
PS C:\Install\mydir> $Dirlist[0..3]
MyFolder-2021-11-22
顺便说一下,而不是
| select -Property Name | foreach { $_.Name }
只需使用
| select -ExpandProperty Name
答案2
我最后只是添加了一个格式列表(ft 是简短版本),它对我有用:
$Dirlist= gci $LBDestination | ? { $_.PSIsContainer } | sort CreationTime | select -Property Name | foreach { $_.Name } | fl