Comment faire pour accélérer Powershell Get-Childitem sur UNC
DIR
ou GCI
est lent dans Powershell, mais rapide dans CMD. Est-il un moyen pour accélérer le processus?
Dans CMD.exe après un sous-seconde de retard, cela répond aussi vite que la fenêtre CMD peut suivre
dir \\remote-server.domain.com\share\folder\file*.*
En Powershell (v2), après+ de 40 secondes de retard, il répond avec une malformation de la lenteur (peut-être 3-4 lignes par seconde)
gci \\remote-server.domain.com\share\folder\file*.*
Je suis en train de numériser les journaux sur un serveur distant, donc peut-être qu'il y a une approche plus rapide.
get-childitem \$s\logs -include $filemask -recurse | select-string -pattern $regex
- Dir en cmd.exe a toujours été plus rapide que toute autre méthode que j'ai jamais utilisé le FileSystemObject en VBScript ou le fournisseur de système de fichiers dans le PS. Au point même que j'ai écrit des fonctions VBScript shell à cmd.exe Dir pour la recherche de fichier. La récursivité permet simplement de façon exponentielle plus prononcé.
- Peut-être que votre PowerShell pourrait appeler la CMD shell avec une commande comme
dir /b /s \\server\logs\file*.*
pour récupérer le chemin complet dans une forme qui PowerShell pourrait facilement? -recurse
est là aussi un report de course contre un domaine local. N'est pas vraiment nécessaire. Peu importe, avec ou sans elle est lente. La raison pour laquelle je demande c'est que (un) c'est un problème connu, et (b) il est difficile de croire que le PS est donc bien pire que l'ancien CMD.- Je ne sais pas la réponse, mais je ferai remarquer que, je m'attends à ce que, tout simplement, la construction de l'objet dans PS prendrait plus de temps que d'interroger acouple d'attributs et de la construction d'une chaîne de caractères. PS ne waaay plus donc je ne suis pas surpris que cela prend plus de temps pour être honnête.
- je vais le faire pour l'obtenir autour d'elle, mais honnêtement, c'est juste idiot d'avoir à utiliser CMD lorsque l'un des points de vente de Powershell est comme un remplacement pour CMD. Nous avons donc une smart shell et rapide shell. 🙂
- oh, je suis totalement d'obtenir que le PS est en train de faire un peu plus, mais il devrait y avoir un moyen de lui dire de faire moins. Sûrement, ils ont encore de la CMD code source pour avoir un aperçu rapide, de sorte qu'ils peuvent ajouter un
-fast
option. - Je suppose que pour une raison de la lenteur est que PowerShell est
Get-ChildItem
est l'extraction d'un ensemble .NET de l'objet de données sur chaque fichier (tout comme l'ensemble de la PS des commandes d'objets de tuyau), et en tirant sur le câble réseau ajoute le temps nécessaire pour aller chercher des propriétés et des ces. CMD, sur l'autre main, est vraiment juste la liste des biens essentiels comme le chemin d'accès et la date de modification. J'ai essayé d'utiliserGet-ChildItem -Filter...
, mais il ne réduit pas les infos recueillies pour chaque fichier--il réduit simplement la sortie définie par les critères spécifiés.
Vous devez vous connecter pour publier un commentaire.
Ici est une bonne explication sur le pourquoi du Get-ChildItem est lent par Lee Holmes. Si vous prenez note de l'observation de "Anon 11 Mar 2010 11:11 AM" au bas de la page, sa solution pourrait fonctionner pour vous.
Anon Code:
[System.IO.Directory]::EnumerateFiles()
comme de PowerShell v3. Cette méthode a été introduite dans le .Net Framework 4.0. Cela vous évitera d'avoir à charger le VisualBasic de l'assemblée.Bon d'accord, c'est la façon dont je le fais, et il semble fonctionner.
Puis $GETFILESBAT points à ceci:
Je suis d'écriture et de suppression de ce fichier BAT à partir du script PowerShell, donc je suppose que c'est une PowerShell seule solution, mais elle ne l'utilise pas seulement PowerShell.
Ma préliminaire des mesures de performance montrent que c'est eleventy mille fois plus rapide.
J'ai testé dcg vs cmd dir vs FileIO.Système de fichiers.GetFiles de @Shawn Melton est référencé lien.
La ligne de fond est que, pour une utilisation quotidienne sur les disques locaux,
GetFiles
est le plus rapide. De loin.CMD DIR
est respectable. Une fois que vous introduisez un ralentissement de la connexion réseau avec de nombreux fichiers,CMD DIR
est légèrement plus rapide queGetFiles
. PuisGet-ChildItem
... wow, cela va de pas trop mal à l'horrible, selon le nombre de fichiers concernés et de la vitesse de la connexion.Quelques essais. J'ai déplacé DCG autour de dans les tests pour s'assurer que les résultats étaient cohérents.
10 itérations de la numérisation
c:\windows\temp
pour *.fichiers tmpGetFiles est 10x plus rapide que CMD dir, qui lui-même est plus de 2x plus rapide que la GCI.
10 itérations de la numérisation
c:\windows\temp
pour *.fichiers tmp avec la récursivitéGetFiles est un peu plus rapide que CMD dir, et les deux sont presque 7x plus rapide que la GCI.
10 itérations de la numérisation d'un serveur sur site sur un autre domaine d'application les fichiers journaux
GetFiles est environ 2x plus rapide que CMD dir, lui-même 10x plus rapide que la GCI.
Une itération de la numérisation d'un serveur distant sur un autre domaine d'application les fichiers journaux, avec de nombreux fichiers impliqués
CMD dir est plus rapide d'aller vers le serveur distant avec beaucoup de fichiers, mais GetFiles est honorablement à proximité. GCI sur l'autre main est un couple de mille fois plus lent.
Deux itérations de la numérisation d'un serveur distant sur un autre domaine d'application les fichiers journaux, avec de nombreux fichiers
Plus ou moins linéaire de l'augmentation, comme le test d'itérations augmente.
Une itération de la numérisation d'un serveur distant sur un autre domaine d'application les fichiers journaux, avec moins de fichiers
Ici GCI n'est pas trop mauvais, GetFiles est 3x plus rapide, et CMD dir est pas loin derrière.
Conclusion
GCI
besoin d'un-raw
ou-fast
option qui n'a pas essayer d'en faire autant. Dans l'intervalle,GetFiles
est une alternative saine qui est seulement de temps en temps un peu plus lent queCMD dir
, et généralement plus rapide (en raison de la ponte CMD.exe?).Pour référence, voici le test.ps1 code.
More or less linear increase as test iterations increase.
Getfiles et CMD a pris 3x plus de temps à s'exécuter le test deux fois, tandis que le GCI a pris 2x plus longtemps. Si c'est l'augmentation linéaire de prévu alors il y aura un moment où DCG devient plus rapide encore, êtes-vous sue vous n'avez pas accidentellement exécuter GetFiles/Dir 3x fois et GCI deux fois?J'ai essayé quelques méthodes suggérées avec une grande quantité de fichiers (~190.000). Comme mentionné dans les Kyle commentaire,
GetFiles
n'est pas très utile ici, car il faut presque jamais.cmd dir était mieux que
Get-ChildItems
lors de mes premiers essais, mais il semble, DCG accélère beaucoup si vous utilisez le-Force
paramètre. Avec cela, le temps nécessaire est environ le même que pour cmd dir.P. S.: Dans mon cas, j'ai eu à exclure la plupart des fichiers en raison de leur extension. Cela a été fait avec
-Exclude
en dcg et avec un|
où dans les autres commandes. De sorte que les résultats pour juste la recherche de fichiers peuvent légèrement différer.Voici un lecteur interactif qui analyse
cmd /c dir
(qui peut prendre en charge les chemins d'accès unc), et permettra de recueillir les 3 plus importantes propriétés pour la plupart des gens: chemin d'accès complet, la taille, l'horodataged'utilisation serait quelque chose comme
$files_with_details = $faster_get_files.GetFileList($unc_compatible_folder)
et il y a une fonction d'aide à vérifier la taille combinée
$faster_get_files.GetSize($files_with_details)
powershell 3.0
, assurez-vous de tester si vous êtes en utilisant 2.0 ou version antérieure. Aussi parce que c'est de l'analyse d'un digest d'une commande cmd il y a une très petite chance que le répertoire est peut-être erroné ou des fichiers pourraient être manquantes, en particulier si des caractères spéciaux dans les noms de dossier fait-il pas correspondre à la(.+)
partie de l'expression régulière. Si vous rencontrez des erreurs s'il vous plaît laissez-moi savoir, et pour rien d'essentiel à la mission merci de valider le chemin d'accès complet à l'aide de la méthode de votre choix