Powershell Select-Object如何获取值数组

时间:2017-10-06 13:13:28

标签: powershell powershell-v5.0

我正在尝试删除几个文件夹的内容。 我有什么:

$Config = @{
    InstallPath = 'C:\Program Files\App'
    SubPaths = @('www\app1', 'www\app2', 'www\app3')
}

以下是获取内容的代码:

$Config.SubPaths | Select-Object { Join-Path $Config.InstallPath $_ } | Get-ChildItem

但它不起作用,因为Get-ChildItem接收如下对象:

@{ Join-Path $Config.InstallPath $_ =C:\Program Files\App\www\app1}

错误:

Get-ChildItem : Cannot find drive. A drive with the name '@{ Join-Path $Config.InstallPath $_ =C' does not exist.
At line:1 char:85
+ ... elect-Object { Join-Path $Config.InstallPath $_ } | Get-ChildItem
+                                                             ~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (@{ Join-Path $C...stallPath $_ =D:String) [Get-ChildItem], DriveNotFoun
   dException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

如何将Select-Object的结果转换为简单的字符串数组?还是其他任何使代码更好的方法?

1 个答案:

答案 0 :(得分:1)

您获得的结果是因为您使用文字属性Join-Path $Config.InstallPath $_创建了一个新对象。相反......

$Config.SubPaths | ForEach-Object { Join-Path $Config.InstallPath $_ } | Get-ChildItem

您不是要尝试选择单个子路径的属性,而是从每个SubPath生成一个字符串。使用Foreach-object代替迭代集合应该可以获得您正在寻找的结果。

虽然您可以使用计算属性创建自定义对象和属性,但我认为这不是您的目标。但要回答标题中的问题,你可以这样做:

$Config.SubPaths | 
    Select-Object @{Name="Path";Expression={Join-Path $Config.InstallPath $_}} | 
    Get-ChildItem

Get-ChildItem应绑定到正在制作的新对象的path属性