2017-10-02 7 views
0

J'essaie de générer un rapport pour tous les fichiers WIM dans mon partage de déploiement MDT. Fondamentalement, je pense avoir besoin de faire une boucle ForEach sur tous les fichiers WIM trouvés. J'ai ce que je pense devrait fonctionner mais, évidemment, il ne fonctionne pas. À quelle distance suis-je?Powershell ForEach Loop

$WimPath = "G:\DeploymentShare\Operating Systems" 

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Select-Object -ExpandProperty VersionInfo | Select-Object FileName | ForEach-Object { Get-WindowsImage -ImagePath $_ } 

L'erreur que je vois est lancinante sur le paramètre étant incorrect pour la commande Get-WindowsImage.

Get-WindowsImage : The parameter is incorrect. 
At line:3 char:147 
+ ... t-Object FileName | ForEach-Object { Get-WindowsImage -ImagePath $_ } 
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Je pense mon Select-Object ne fonctionne pas comme je pense qu'il devrait ou je ne suis pas en utilisant correctement le pipeline dans ma commande Get-WindowsImage.

+1

essayer 'Get-ChildItem -Path $ WimPath -Filter * .wim -Recurse -File | ForEach-Object {Obtenir-WindowsImage -ImagePath $ _. Fullname} ' – brendan62269

+1

@ Brendand62269, bien joué! Je me demandais si j'avais même besoin du 'Select-Object'. Je suppose que je n'ai pas ... Comment puis-je vous marquer comme celui qui a répondu correctement? – RKillcrazy

Répondre

1

Je suis un noob PowerShell et ne comprennent pas pleinement, mais je pense ce qui se passe peut être expliqué d'abord se concentrer sur cette partie de la commande:

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Select-Object -ExpandProperty VersionInfo | Select-Object FileName 

Pour obtenir cette loin, nous obtenons d'abord tous les fichiers *.wim dans votre chemin, nous développons la propriété VersionInfo, puis sélectionnez le FileName. Dans la console, qui vous montrera des résultats comme celui-ci:

 
FileName 
-------- 
[files here] 

L'astuce consiste à comprendre ce que PowerShell vous dit avec cette sortie. Le fait que vous voyez un en-tête FileName signifie que le pipeline a un flux de Objets avec une propriété nommée FileName. Ensuite, nous envoyons ce flux d'objets à ForEach-Object et regardons la variable spéciale $_.

Espérons qu'il est maintenant plus clair ce qui se passe. Get-WindowsImage -ImagePath $_ veut voir une valeur de chaîne contenant le chemin d'accès d'un fichier * .wim. Mais nous lui avons envoyé un objet avec une propriété.

Vous pouvez résoudre ce problème de plusieurs manières ... en ajoutant ExpandProperty au second Select-Object le ferait probablement. Mais vraiment, il n'y a aucune raison pour que deux Select-Object soient là. Je pense que vous pourriez faire:

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Select-Object -ExpandProperty FullName | ForEach-Object { Get-WindowsImage -ImagePath $_ } 

Et l'astuce ici est la représentation de chaîne que vous voyez dans la coquille de Get-ChildItem ne montre pas nécessairement chaque propriété dans l'objet. Il n'y aurait pas d'espace. Le FileName était toujours là, et vous pouvez le voir en cochant la cmdlet Get-Member, comme ceci:

Get-ChildItem -Path $WimPath -Filter *.wim -Recurse -File | Get-Member 
+0

Comme vous, je suis un peu un _noob_. Bonne capture sur la valeur ** chaîne ** nécessaire pour la commande 'Get-WindowsImage'. Maintenant que je le regarde, la documentation indique que c'est exactement ce dont nous avons besoin. Je jouais avec 'Get-ChildItem -Path $ WimPath -Filter * .wim -Recurse -File | Select-Object -ExpandProperty VersionInfo | Select-Object FileName' et _thought_ ça me donnait ce dont j'avais besoin. Je n'ai pas bien compris le type de données qu'il me donnait et je ne comprends toujours pas comment le comprendre. – RKillcrazy