2017-10-06 6 views
1

Je suis en train de supprimer le contenu de quelques dossiers. Ce que j'ai:Powershell Select-Object comment obtenir tableau de valeurs

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

Et voici le code pour obtenir le contenu:

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

Mais ça ne marche pas, parce que Get-ChildItem objet comme ci-dessous reçoit:

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

erreur :

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 

Comment puis-je convertir résultat de Select-Object à simple tableau de chaînes? Ou toute autre approche pour améliorer le code?

+0

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

Répondre

1

Les résultats que vous obtenez sont parce que vous avez créé un nouvel objet avec la propriété littérale Join-Path $Config.InstallPath $_. Au lieu de cela ...

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

Vous n'êtes pas essayez de sélectionner une propriété d'un seul sous-chemin, mais générer une chaîne de chacun des sous-chemins. En utilisant Foreach-object au lieu d'itérer sur la collection devrait vous obtenir les résultats que vous recherchez.

Bien que vous puissiez créer des objets et des propriétés personnalisés à l'aide de propriétés calculées, je suppose que ce n'est pas la direction que vous recherchez. Mais pour répondre à la question dans le titre que vous auriez pu faire ceci:

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

Get-ChildItem doit se lier à la propriété du chemin du nouvel objet se sont fait

+0

Merci, c'est exactement ce que je cherche. – Zergatul