Статистика

Участников проекта 105
Опубликовано статей 78
Отчет по карме. Топ 20

Новости блога

1 29.11.2013  Сегодня самым активным участникам newblog'а был выплачен доход с sape.
7 02.11.2012  Ура! Свешилось, нашему сайту дали тИЦ 10. Спасибо всем кто принимает участие в развитии нашего блога.
8 21.08.2012  Интеграция с sape.ru. Теперь каждый автор статей на newblog автоматически зарабатывает на рекламе.
Все новости

Топ 5 категорий

Программирование 46
Операционные системы 9
Базы данных 4
Туризм 2
Заметки 2

Последние 5 заметок (90)

gullyar - Закладки gullyar
gullyar - Ваша первая закладка
osadchaya - Закладки osadchaya
Ira0231188 - Закладки Ira0231188
Ira0231188 - Закладки Ira0231188

Ссылки

www.freedev.asia
Подробности монтаж видеонаблюдения на сайте.

Обновление дистрибутивов на флешнакопителях (синхронизация флешнакопителей с компьютером)

27.06.2013 12:38 | Просмотров: 4122 | Доход: 124.59 руб. | Комментариев: 33
[Администрирование ] 
Рейтинг: 3.67/3

Привет Всем! Сегодня речь у нас пойдет о такой полезной вещи (а может и для кого и не очень полезной) как синхронизация Flash drive (будь то простая флешка или же внешний жесткий диск) с  компьютером (то есть перенос свежих файлов с компьютера на флешнакопитель, обновляя дистрибутивы или любые другие файлы). Это будет полезно для сисадминов, а может и не только для них, в общем кому необходимо всегда иметь у себя под рукой  свежие дистрибутивы. Реализуем мы все это с помощью PowerShell, то есть средствами Windows. И так, приступаем.

 

1)      Для начала надо воспользоваться скриптом описанным раннее в статье «Качаем обновления дистрибутивов в два клика»;

2)      Далее нам необходимо создать «назначенное задание» на компьютере, чтобы данный скрипт выполнялся в определенное время (кому как удобно), для закачки свежих версий дистрибутивов на компьютер;

3)      Добавляем скрипт в автозагрузку компьютера, приведенный ниже, чтобы обновить дистрибутивы уже непосредственно на флешнакопителе.

     Компьютер будет ожидать подключения к нему указанного флешнакопителя, после чего будет производить обновления дистрибутивов.

$ver="0.1"
$ProgrammName="Synchronization"

try
{
    # Функция  записи в лог файл
    ./function_1.ps1 #Инициализация функций
    $global:logfilename = "log`\"+ $ProgrammName +".log"
    write-log "$ProgrammName (ver $ver) started."
}
catch 
{		
    return "Error loading functions function_1.ps1"
}

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-log 
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
}
write-log " Event detected =  $eventTypeName " #Запись события в лог файл
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-log " Drive name =  $driveLetter"
write-log " Drive label =  $driveLabel "
# Запуск необходимого процесса, если подключен определенный диск
if ($driveLetter -eq 'H:' -and $driveLabel -eq 'MiMushi')
{
start-sleep -seconds 3
Copy-Item -Path D:\Distr\Utility\tweak -Recurse H:\tools\antivir_tools -Force
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Повторение процесса до следующего события
Unregister-Event -SourceIdentifier volumeChange

скрипт синхронизации флешнакопителей с компьютером

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

 

$ver = "0.1"
$dt=Get-Date -Format "dd-MM-yyyy"
New-Item -ItemType directory log -Force | out-null #Создание директории для логов

[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") 

$global:logfilename="log\"+$dt+"_LOG.log"
[int]$global:errorcount=0 #Ведем подсчет ошибок
[int]$global:warningcount=0 #Ведем подсчет предупреждений

function global:Write-log	# Функция пишет сообщения в лог-файл и выводит на экран.
{param($message,[string]$type="info",[string]$logfile=$global:logfilename,[switch]$silent)	
    $dt=Get-Date -Format "dd.MM.yyyy HH:mm:ss"	
    $msg=$dt + "`t" + $type + "`t" + $message #формат: 01.01.2001 01:01:01 [tab] error [tab] Сообщение
    Out-File -FilePath $logfile -InputObject $msg -Append -encoding unicode
}

файл (function_1.ps1) с функцией write-log

PowerShell.exe -windowstyle Hidden D:\******* (*путь к вашему скрипту)

bat  файл для запуска скрипта синхронизации в скрытом режиме

 

Конечно это далеко не идеальный вариант обновления дистрибутивов, но тоже вариант. Нет пределу совершенству, поэтому тут все в ваших руках, можете предложить свои варианты реализации данного вопроса, всегда будем рады принять ваше мнение.

 


© MiMushi
| Комментировать статью |
  • GM +2587 (01.07.2013 10:23)
    А что произойдет если в момент синхронизации пользователь случайно выдернул накопитель? Обновится ли файл при повторном подключении?
    | Ответить |
  • WTP +711 (01.07.2013 12:47)
    А вот если такой вариант... Вот есть сотка на ондроеде. В ней папочка, например с книжками. И на компе с виндой аналогичная папочка. Осилит?
    З.Ы. Бабло не платил, скрипта не видел)
    | Ответить |
    • WTP +711 (01.07.2013 12:48)
      Хоть кусочек можно было бы и показать, для затравки...
      | Ответить |
    • WTP +711 (01.07.2013 12:50)
      Кстати, админ!
      Не пашет чето оплата...
      
      Ошибка платежа
      Произошла ошибка
      
       Невозможно выполнить оплату для данного партнера (166415).
      | Ответить |
      • WTP +711 (01.07.2013 12:51)
        Да, и еще. Хочу прикрепление картинок к комментам!
        | Ответить |
        • GM +2587 (01.07.2013 14:21)
          Руки не доходят в последнее время до блога.. Как появится время-сделаю..
          | Ответить |
        • Tiger +458 (01.07.2013 14:22)
          Что-то у тебя хотелок много!
          | Ответить |
          • MiMushi +243 (01.07.2013 14:25)
            да ладно, пусть хотит, думаю не жалко такое сделать, только плюсом будет для блога
            | Ответить |
          • WTP +711 (01.07.2013 14:37)
            Минус тебе! За жадность.
            | Ответить |
      • GM +2587 (01.07.2013 14:20)
        Оплату, к сожалению, можно произвести только с российских операторов сотовой связи..
        | Ответить |
        • MiMushi +243 (01.07.2013 14:24)
          вот блин....то есть сам сделал такую статью, сам и плати за нее? прикольно блин )))
          | Ответить |
          • Tiger +458 (01.07.2013 14:29)
            Отсюда вывод: не жадничай, пиши бесплатные статьи ;)
            | Ответить |
            • GM +2587 (01.07.2013 14:36)
              Ну с бесплатных капает за рекламу..
              | Ответить |
    • Tiger +458 (01.07.2013 14:25)
      Еще лучше было бы, если втыкаешь телефон и оно самом при подключении обновляется :)
      | Ответить |
      • WTP +711 (01.07.2013 14:36)
        Вот-вот! Самое то. Больше скриптов, хороших и разных!
        | Ответить |
      • GM +2587 (01.07.2013 14:37)
        В linux\'е можно отловить это событие через udev.. интересно возможно ли такое в windows ?
        | Ответить |
        • WTP +711 (01.07.2013 14:38)
          Ну как-то же система узнает что устройство подключилось). Значит можно. Только врядли через PowerShell.
          | Ответить |
          • F1 +2 (05.07.2013 10:40)
            Для этого есть событие DEVICE_NOTIFY_WINDOW_HANDLE.
            Придется писать фоновый агент.
            | Ответить |
            • F1 +2 (05.07.2013 10:47)
              Или через PowerShell
              Register-wmievent –query "select * from __instancecreationevent within 5 where targetinstance isa \'win32_logicaldisk\'" –action { Write "Подключена флеха!!!" }
              | Ответить |
              • WTP +711 (05.07.2013 11:00)
                Аффтар! Перепиши скрипт с учетом советов. А потом в открытый доступ)
                | Ответить |
                • MiMushi +243 (05.07.2013 12:15)
                  в открытый доступ вынесу, всеравно оплата не работает!
                  | Ответить |
              • MiMushi +243 (05.07.2013 12:14)
                и у вас этот скрипт работает? лично у меня он выпал в ошибку....Я же предлагаю свой вариант, в общем, кому что понравиться, выбирайте ;)
                
                $Devices = @(Get-WmiObject -Query "Select * From Win32_LogicalDisk" | ? { $_.driveType -eq 2 })
                ForEach ($Device in $Devices){
                    gwmi win32_volume | Where-Object {$_.DriveLetter -eq ($Device.DeviceID)} | Select-Object DriveLetter,SerialNumber
                }
                так мы определим букву диска, которую назначил компьютер подключенному устройству...
                
                И еще, у меня вопрос к уважаемому Tiger\'у и F1, что вы будете делать, если на ваш компьютер подключили совсем стороннюю флешку, на которой ну не надо данного ПО вовсе?я же ведь предлагал вариант только для флешки пользователя, которому надо данное ПО
                | Ответить |
                • WTP +711 (05.07.2013 14:01)
                  А в каких виндах работает? 7, ХРень?
                  | Ответить |
                  • MiMushi +243 (05.07.2013 14:04)
                    Во всех, начиная с ХРени, в общем везде, где есть PowerShell
                    | Ответить |
                • Аноним 0 (05.07.2013 14:27)
                  Может стоит накопитель обозвать как-то по особому и скриптом уже определять название. Если не подходит то не синхронизировать данные
                  | Ответить |
                  • MiMushi +243 (05.07.2013 15:07)
                    ну если вы не заметили, уважаемый аноним, то это уже реализовано в скрипте, вот этой строчкой:
                    $driveLabel = ([wmi]"Win32_LogicalDisk=\'$driveLetter\'").VolumeName
                    | Ответить |
                    • GM +2587 (06.07.2013 09:56)
                      хм.. а может определять по сирийному номеру флешки? Или это будет сложнее?
                      | Ответить |
                      • MiMushi +243 (07.07.2013 14:02)
                        и это тоже возможно вполне, чуть выше в комментариях я упомянул об этом, когда предлагал как вариант определения usb устройства , там и есть определение серийного номера устройства (SerialNumber)
                        | Ответить |
    • MiMushi +243 (01.07.2013 16:09)
      Осилит, проверено лично на своем опыте(как раз в плане книжек на телефоне), ибо есть там одна строчка в скрипте "D:\Books\Edogava_RamPo\ -Recurse   G:\Books -Force" откуда и куда копируем, (в данном случае с диска d на диск G)!
      | Ответить |
      • WTP +711 (01.07.2013 16:14)
        Дело за малым - выложить скрипт в открытый доступ)
        | Ответить |
        • GM +2587 (01.07.2013 16:52)
          Под линухой кстати есть готовая штуковина, называется rsync:
          http://ru.wikipedia.org/wiki/Rsync
          | Ответить |
          • Tiger +458 (02.07.2013 11:06)
            Да! Пользовался, отличная вещь.
            | Ответить |
            • GM +2587 (04.07.2013 15:23)
              Linux вообще отличная вещь ;)
              | Ответить |