Проблема производительности PowerShell - PullRequest
2 голосов
/ 13 января 2011

Я новичок в powershell.Я использую следующий скрипт powershell для копирования файла с сетевого ресурса, но затраты времени по сравнению с традиционным пакетным файлом Windows смехотворно велики.В чем может быть причина?

$dlls=get-childitem -path "\\myShare\myBinFolder" -include *.dll -recurse
copy-item $dlls -destination c:\bins

Спасибо

Обновление - 1 - 13: 38 13.01.2011

Почему Get-ChildItem такой медленный?1008 *

http://blogs.msdn.com/b/powershell/archive/2009/11/04/why-is-get-childitem-so-slow.aspx

Ответы [ 3 ]

4 голосов
/ 13 января 2011

Не используйте параметр Include.Вместо этого используйте параметр Filter.Включение потребует, чтобы каждый файл был возвращен из общего ресурса и отфильтрован локально.Использование Filter должно позволить выполнить фильтрацию на удаленном конце.

$dlls = Get-ChildItem -Path "\\myShare\myBinFolder" -Filter *.dll -recurse

или использовать позиционную особенность этих параметров:

$dlls = Get-ChildItem \\myShare\myBinFolder *.dll -r

Фактически, единственный раз, когда я когда-либоиспользуйте Include сверх Filter, если мне нужно было указать несколько условий фильтра («Включить» принимает массив строк), например:

Get-ChildItem . -inc *.h,*.cpp,*.rc -r
3 голосов
/ 13 января 2011

Все, что вам действительно нужно от удаленной системы, - это список полных путей к файлам .dll в этой общей папке.Get-childitem является излишним для этого и имеет известные проблемы с удаленной работой с большими структурами каталогов.

Посмотрите, не намного ли это быстрее:

cmd /c dir \\Myshare\Folder\*.dll /b /s |% {Copy-Item $_ -destination C:\bins} 

Примечание: двойной обратный слеш вUNC отображается в сообщении как единое целое.
Как мне это исправить?

3 голосов
/ 13 января 2011

Один из способов оптимизировать это - избегать присвоения его переменной.Попробуйте это

Get-ChildItem *.dll -Path \\Myshare\Folder -recurse | % { Copy-item $_.FullName -destination C:\bins }

Вы можете использовать команду Measure-Command, чтобы измерить, сколько времени занимают эти два метода.Вы можете сделать это:

(Measure-Command {     Get-ChildItem *.dll -Path \\Myshare\Folder -recurse | % { Copy-item $_.FullName -destination C:\bins } }).Milliseconds

и

(Measure-Command {$dlls = Get-ChildItem *.dll -Path \\Myshare\Folder -recurse; copy-item $dlls -Destination C:\bins}).Milliseconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...