2017-06-02 4 views
1

J'essaie d'exporter une liste de documents modifiés après une date définie, y compris ses propriétaires à partir d'un balayage récursif en utilisant Get-ChildItem.Powershell Get-ChildItem, filtré sur la date avec le propriétaire et exporter vers txt ou csv

Pour une raison quelconque, je ne peux pas l'obtenir au port vers un fichier/csv:

$Location2 = "\\fs01\DATAIT" 
$loc2 ="melb" 

cd $Location2 

Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { Write-Host $_.Name "," $_.lastwritetime "," ((get-ACL).owner) } > c:\output\filelisting-$loc2.txt 

pourrait l'un des gourous PowerShell sur ici faire la lumière s'il vous plaît?

Répondre

1

Le problème avec votre code est que vous utilisez Write-Host qui envoie explicitement la sortie à la console (que vous ne pouvez pas rediriger ailleurs). La solution rapide est la suivante:

Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { "$($_.Name),$($_.lastwritetime),$((get-ACL).owner)" } > filelisting-$loc2.txt 

Cette affiche une chaîne à la sortie standard (l'équivalent de l'utilisation Write-Output). Je l'ai fait une seule chaîne qui inclut les variables que vous vouliez accéder en utilisant l'opérateur sous-expression $() dans une chaîne entre guillemets. Cet opérateur est nécessaire pour accéder aux propriétés des objets ou pour exécuter d'autres cmdlets/code complexe (essentiellement rien de plus qu'une simple variable $) dans une telle chaîne.

Vous pouvez améliorer davantage le code en créant un résultat d'objet, ce qui vous permettrait ensuite d'exploiter d'autres cmdlets dans le pipeline, telles que Export-CSV. Je suggère ceci:

Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | ForEach-Object { 
    $Properties = [Ordered]@{ 
     Name = $_.Name 
     LastWriteTime = $_.LastWriteTime 
     Owner = (Get-ACL).Owner 
    } 

    New-Object -TypeName PSObject -Property $Properties 
} | Export-CSV $Loc2.csv 

Cela crée une @{} Hashtable des propriétés que vous vouliez et utilise ensuite cette table de hachage pour créer un objet avec PowerShell New-Object. Cet objet est ensuite renvoyé à la sortie standard, qui entre dans le pipeline. Lorsque la boucle ForEach-Object conclut tous les objets sont envoyés à Export-CSV qui les renvoie ensuite correctement en tant que CSV (car il prend l'entrée d'objet).


  • En aparté, voici une lecture intéressante du créateur de PowerShell pourquoi Write-Host is considered harmful. nécessite PowerShell 3 ou supérieur. Si vous utilisez PowerShell 2, supprimez-le. Il garde simplement l'ordre des propriétés dans l'objet dans l'ordre dans lequel elles ont été définies.

+1

Parfait! merci beaucoup pour votre réponse, a travaillé un régal! J'ai commencé à utiliser l'export-CSV pour d'autres scripts et c'est génial, je n'avais aucune idée qu'il existait haha. À votre santé. –