6
votes

Puis-je inclure le dossier racine pour obtenir la sortie-childitem de manière programmatique?

Si j'exécute cette commande simple:

E:\mytree
E:\mytree\folder1                                                                                                                                                                      
E:\mytree\folder2                                                                                                                                                                      
E:\mytree\folder3                                                                                                                                                                      
E:\mytree\file1.txt                                                                                                                                                                    
E:\mytree\file12.txt                                                                                                                                                                   
E:\mytree\folder1\folder.with.dots                                                                                                                                                     
E:\mytree\folder1\folder.with.dots\file inside folder with dots.txt                                                                                                                    
E:\mytree\folder3\file4.doc    


0 commentaires

6 Réponses :


0
votes

MISE À JOUR: J'ai lu la question à nouveau et j'ai compris que votre exigence est différente. En regardant comment cela peut être fait, en ce moment. :)

Ancienne réponse

psparentpath contient le dossier parent. Si vous parlez de la racine comme dans E: \, vous pouvez obtenir cela en utilisant la propriété root . xxx

ou dans le second cas, xxx


0 commentaires

0
votes

C'est l'idée que j'avais xxx

mais j'attendrai les autres conseils. :)


0 commentaires

5
votes
get-childitem $root -recurse | foreach-object -begin { $arr = @((get-item $root).fullname) } -process { $arr+= $_.fullname } -end { $arr }
Using foreach-object cmdlet's begin switch, we do some work before handling the objects from get-childitem: we create an array and put the filepath of the root in there. Then for each object in the pipeline, we append its filepath to the array.Finally, we output the array to the pipeline. 

0 commentaires

4
votes
@(gi e:\mytree) + @(gci e:\mytree -r) | select fullname
@(..) forces the return value from each expression to be an array

0 commentaires

-1
votes

Voici ma solution "vieille école" à ce problème. Pour moi, il est beaucoup plus facile d'utiliser et de lire.

# add all the file Paths to an array so the Parent can be included
$ToUpdate = @()

$FolderToUpdate = Get-ChildItem $DirectorytoChange -Directory

foreach ($Folder in $FolderToUpdate)
{
  #add the paths to the array
  $ToUpdate += $Folder.FullName
}
# Include the Root
$ToUpdate += $DirectorytoChange


foreach ($Path in $ToUpdate)
{
# Do stuff
}


1 commentaires

Avec cette solution $ FolderToupdate contient une gamme d'articles enfants; Vous copiez ensuite des éléments de ce tableau un à la fois du tableau $ TUPDate (bien que l'extraction de la propriété FullName). Une approche plus efficace serait $ TUPDate = @ (, $ (@ annuelsOchanger) + @ (get-childitem $ daffinertyTchanger -directory | Select-Object -expandProperty FullName) .



2
votes

Une autre option consiste simplement à rouler une fonction telle que ci-dessous. xxx

Vous pouvez ajouter des paramètres dans les paramètres que vous souhaitez transmettre; comme un argument -Filtre. Ici, j'ai eu du cap de l'hypothèse selon laquelle si vous utilisiez cette fonction, vous voudrez qu'il soit exécuté sur un conteneur plutôt que sur une feuille, vous voudrez recueil, et que vous souhaiteriez chercher un tas de fichiers à la fois (donner un léger Gain de performance via l'option Outbuffer).

Ce n'est pas aussi sexy ni intelligent que d'autres solutions, mais devrait être efficace, facile à réutiliser, facile à comprendre et fonctionne pour des conteneurs vides.

Ceci est similaire à Votre propre réponse , mais a quelques différences.

  • La validation des paramètres est effectuée à l'aide de Attribut validatescript Conçu pour la validation des paramètres.
  • Échec de la validation jette une erreur plutôt que d'utiliser écriture-host (une cmdlet Vous devez généralement éviter )
  • Vous accumulez une gamme de résultats, puis retournez-la plutôt que de nourrir la sortie directement au pipeline. Pour les répertoires volumineux, cela signifie que vous créerez un très grand tableau en mémoire / vous pouvez frapper des problèmes de performance ou manquer de mémoire.
  • Vous convertissez chaque objet système de fichiers en un PSObject avec une propriété de nom complet, mais n'ayez pas vraiment besoin de cela. Si vous souhaitez réduire la taille des objets en supprimant les attributs non requis, vous pouvez simplement tuyer la sortie à SELECT-Object -Properties FULLNAME ou SELECT-Object -ExpandProperty FullName ( Les premiers créant la même sortie que votre fonction actuelle, ce dernier renvoie un éventail de chaînes tenant la valeur du nom complet).

    long terme, j'ai suggéré ce Amélioration à ms.


0 commentaires