Combiner les résultats de deux appels Get-ChildItem distincts en une seule variable pour faire le même traitement sur eux
Je suis en train d'écrire un script PowerShell pour créer une liste de fichiers, à partir de plusieurs répertoires. Après tous les répertoires ont été ajoutés à la liste principale, j'aimerais faire le même traitement à tous les fichiers.
C'est ce que j'ai:
$items = New-Object Collections.Generic.List[IO.FileInfo]
$loc1 = @(Get-ChildItem -Path "\\server\C$\Program Files (x86)\Data1\" -Recurse)
$loc2 = @(Get-ChildItem -Path "\\server\C$\Web\DataStorage\" -Recurse)
$items.Add($loc1) # This line fails (the next also fails)
$items.Add($loc2)
# Processing code is here
qui échoue avec ce message d'erreur:
Ne peut pas convertir l'argument "0", avec
valeur: "le Système de.Object[]", pour "Ajouter" pour
"type de Système.IO.FileInfo": "Ne Peut Pas
convertir le Système".Object[]" va lue
"type de Système.Object[]" type
"Le système de.IO.FileInfo"."
Je suis surtout intéressé à la quelle est la bonne approche pour ce type de situation. Je me rends compte que mon code est un très C moyen de le faire -- s'il y a un plus PowerShell façon d'accomplir la même tâche, je suis tout à fait pour. La clé, c'est que le nombre de $loc#'s
peuvent changer au fil du temps, de sorte que l'ajout et la suppression d'un ou de deux devrait être facile dans le code résultant.
source d'informationauteur Nate
Vous devez vous connecter pour publier un commentaire.
Pas sûr que vous besoin d'une liste générique ici. Vous pouvez simplement utiliser un PowerShell tableau par exemple:
PowerShell les tableaux peuvent être concaténées à l'aide de
+=
.De get-help get-childitem:
-Chemin d'accès
Spécifie un chemin d'accès à un ou plusieurs endroits. Les caractères génériques sont autorisés. L'emplacement par défaut est le répertoire courant (.).
Keith réponse est le PowerShell façon: il suffit d'utiliser @(...)+@(...).
Si vous voulez vraiment un typesafe Liste[IO.FileInfo], alors vous devez utiliser AddRange, et de convertir l'objet tableau à une FileInfo tableau -- vous devez également vous assurer que vous n'obtenez pas de DirectoryInfo objets, ou autre, vous devez utiliser IO.FileSystemInfo que votre type de liste:
Donc, éviter les répertoires:
Ou de l'utilisation FileSystemInfo (la classe de base commune de FileInfo et DirectoryInfo):
Voici peut-être même plus PowerShell-ish manière qui n'a pas besoin de la partie de concaténation ou explicite de l'ajout d'éléments à la suite à tous:
Mais le code à l'intérieur du bloc de script doit être écrit un peu plus attentivement afin d'éviter les indésirables de sortie mélangés avec des éléments de système de fichier.
EDIT: Sinon, et peut-être de manière plus efficace, au lieu de
.{ ... }
nous pouvonsutilisation
@( ... )
ou$( ... )
où...
représente le code contenant plusieursles appels de
Get-ChildItem
.-Filter
est plus performant que-Include
donc si vous n'avez pas beaucoup de différentes extensions, il suffit de concaténer deux listes filtrées pourrait être plus rapide.J'ai comparé le résultat avec un timer comme ceci: