none
Помогите ускорить скрипт. RRS feed

  • Вопрос

  • Всем привет!

    я написал скрипт - ищет файлы по расширению и копирует их на сервер:

    $date=Get-Date -format 'dd.MM.yyyy-(HH-mm-ss)'
    $computers = Get-Content "D:\computer.txt"
    
    md E:\$date\$computer
    
    $extensions = "*.mdb,*.accdb,*.dbf"
    $extensions=$extensions.Split(',')
    $sources = "\\$computer\C$,\\$computer\D$"
    $sources=$sources.Split(',')
    
    foreach ($computer in $computers) {
    
    
    foreach ($extension in $extensions) {
    
    foreach ($source in $sources) {
    
    $destination = "\\rezerv\SB\$date\$computer\"
    
        Get-ChildItem $source -Recurse $extension -ErrorAction SilentlyContinue | Where {!$_.PsIsContainer} | Foreach {
         $path = $_.FullName.Replace($source,$destination)
            
         If (!(Test-Path $path))    { mkdir $path }    
         Copy-Item $_.FullName $path -Force
        }
        }
        }
        }

    собственно вопрос:

    Есть ли возможность как нибудь заставить быстрее его работать?

    Может можно как-нибудь по другому решить задачу?

    Всем спасибо!

Ответы

  • Вложенные foreach это плохо потому что медленно

    Сделайте workflow в котором можно вместе с foreach использовать ключик -parallel

    Это можно сделать заменив первый форич с компами

    Убираете foreach extension и вместо него в Get-ChildItem пишете -Include $extensions

    сорсы так же запишиваете в foreach -parallel

    В итоге у вас на каждой машине параллельно будут обрабатыватсья все сорсы


    The opinion expressed by me is not an official position of Microsoft



    Модератор
  • ограничение количества потоков было в том скриптике, что казун предлагал.

    а скрипт на стороне клиентов таки лучше через политики имхо настроить...

    • Помечено в качестве ответа Vector BCOModerator 14 июля 2018 г. 18:51

Все ответы

  • а чем вас воркфлоу не устроил?
  • тоже медленно.
  • Вложенные foreach это плохо потому что медленно

    Сделайте workflow в котором можно вместе с foreach использовать ключик -parallel

    Это можно сделать заменив первый форич с компами

    Убираете foreach extension и вместо него в Get-ChildItem пишете -Include $extensions

    сорсы так же запишиваете в foreach -parallel

    В итоге у вас на каждой машине параллельно будут обрабатыватсья все сорсы


    The opinion expressed by me is not an official position of Microsoft



    Модератор
  • допустим у вас 3 компа с 2мя дисками и 3 типа расширений

    вы в данный момент последовательно запускаете 3*2*3=18 потоков, причем внутрь каждого поиска пихаете еще один форич...

    потом спрашиваете почему медленно... 

    я уже не спрашиваю, что вы так в повершельный ls упоролись, когда с робокопи было бы таки надежней
    • Изменено Svolotch 31 мая 2017 г. 13:24
  • я в ПоШе не силён. как это реализовать?
  • да и собственно параметр -path поддерживает несколько значений... у вас на компах по которым вы будете рыскать физически винтов два (для дисков С и D) или один разбитый на логические?
  • один разбитый на логические
  • один разбитый на логические

    ну тогда возможно нет смысла параллелить поиск по двум дискам.. возможно упремся в дисковую подсистему..

    а вы можете примерно обьяснить что, как и ЗАЧЕМ вы копируете? 

    то есть вы запускать скрипт вы будете с дестинейшн сервера или с другой машины? м.б. имеет смысл инициировать копирование с сорсов?

  • запускать планирую с одной машины на список машин из файлов. Это для нашей СБ - хотят посмотреть какие файлы есть на рабочих станциях ну и скопировать их на сервер
  • запускать планирую с одной машины на список машин из файлов. Это для нашей СБ - хотят посмотреть какие файлы есть на рабочих станциях ну и скопировать их на сервер

    тут вопрос ботлнеков во что упремся и как скоро. Если машин немного то тут один рзговор можно ранить скрипт с одного хоста, если машин существенно больше 20-30 то лучше ранить мелкие скрипты на стороне клиентов дабы не повесить нашу изначальную машину. Если потенциальных файлов мало (самих файлов), то можно параллелить таски, если файлов много то параллельно лучше запускать задачи в ограниченное число потоков или вообще отказаться от этой затеи.

    У вас WinRM работает, или есть ли возможность его настроить?


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • WinRm работает.
  • ограничение количества потоков было в том скриптике, что казун предлагал.

    а скрипт на стороне клиентов таки лучше через политики имхо настроить...

    • Помечено в качестве ответа Vector BCOModerator 14 июля 2018 г. 18:51