Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell

Модерирует : KLASS, IFkO

KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

   

Uriu

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Версии

PowerShell 1.0 -  На текущий момент совершенно неактуальная версия, интересная только для истории. /Прямые ссылки/
PowerShell 2.0 и WinRM 2.0 - Последняя версия, работающая на Windows XP и Windows 2003 (Ещё) /Прямые ссылки/
PowerShell 3.0 (Windows Management Framework 3.0)
PowerShell 4.0 (Windows Management Framework 4.0)
PowerShell 5.0 (Windows Management Framework 5.0)
PowerShell 5.1 (Windows Management Framework 5.1)
PowerShell Core 6.0 (не заменяет PowerShell 5.1)



Ассоциация

Что бы ассоциировать скрипты с PowerShell, аналогично выполнению .bat/.cmd-файлов
нужно в командной строке набрать следующую команду(ы)
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\system32\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\sysWOW64\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версия 6.0 дя 32-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files (86)\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*
Версия 6.0 дя 64-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*



вопрос о подписи скриптов

Что бы PowerShell не задавал вопрос о том, что скрипты не подписаны, ввести в нем команду
set-executionpolicy unrestricted
или в командной строке
powershell Set-ExecutionPolicy Unrestricted -force
(для этих 2-х действий требуются административные права)



Прочее


  • Если используете "белый список" в брандмауэре Windows, то для работы сценариев в сети необходимо создать 2 исходящих правила для svchost.exe и PowerShell.exe.
  • В отличие от батников кодировка скриптов на PowerShell должна быть 1251 (ANSI)




Расширение возможностей PowerShell
Функции
* Write-Color
* PowerTab --- Расширение функций клавиши Tab
Провайдеры
Готовые скрипты
* Ошибки и предупреждения в журнале событий по электронной почте (в4.0)
 


Работа со сценариями в Windows PowerShell
Раздел в MSDN
Краткие справочники по Windows PowerShell 3.0 (english)
Windows PowerShell Франк Кох (БЕРН)  Разработчик и пропагандист платформы. На русском языке в формате pdf и doc

Всего записей: 340 | Зарегистр. 25-11-2004 | Отправлено: 07:13 23-03-2006 | Исправлено: KapralBel, 09:31 29-01-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS
 
Надо вставить вызов
 | Get-Newer | Start-BitsTransfer  
 
определение Get-Newer должно быть новое
 
опять вынужден откланяться на время.
Кто-нибудь ещё пока может тебе помочь отладить написанное.
 
 
KLASS

Цитата:
 если возникнут траблы у тех, кто твой код будет юзать,

 
Я надеюсь, они самостоятельно догадаются "Редактировать" исходник не тупо, и убрать например мои жирные выделения из форумного кода.
Суть опять же в том, что то, что предназначено людям, плохо подходит для программ.
 
Сделать удобно для человеческого восприятия отдельная работа, а сделать потом удобно для машиной обработки ещё более отдельная.
 
В PS форматироваться может только самый конечный результат, который Out-* за пределы PS.  
Но если результат все-таки предназначен программам, то структуру сохраняют ConvertTo-* или Export-*

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 15:11 28-08-2017 | Исправлено: LevT, 15:13 28-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Давай сделаем проще, вот что у меня получилось в итоге

Всего записей: 10089 | Зарегистр. 12-10-2001 | Отправлено: 15:17 28-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вчерашний мой Get-LocalFile не несёт никакого смысла в свете того, что в исходном CSV есть и URL исходника, и локальный путь  
 
Ты же отказался писать свою епитимью)
Дай попробую за тебя
 
function Get-LocalFile {
param (
   [string]$remote
)
    'c:\soft.txt' | Import-CSV | Where Source -match $remote | Select -Expand Destination
}
(как-то так... это псевдокод набитый прямо здесь)
 
 
 
Добавлено:
 
Но твоя задача должна решаться с переписанной сегодня функцией так:
 
Import-CSV | Get-Newer | Start-BitsTransfer

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 15:29 28-08-2017 | Исправлено: LevT, 17:25 28-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опять ребусы...

Всего записей: 10089 | Зарегистр. 12-10-2001 | Отправлено: 15:54 28-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Да причём ребусы.
Я показал решение упражнения, которое вчера предлагал решить тебе.
Оно показывает, как пошиком обрабатывать коллекции объектов, импортированные из CSV (конкретно как фильтровать записи из одного поля и выдавать значение другого)  
 
но поскольку во входных данных есть локальный путь, функция Get-LocalPath для дела не нужна.
Она была бы нужна, если бы на входе был только список URL.

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 16:13 28-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Я понял (теоретически), что ты показал, но в мозгу нету тех функций и понимания, как они работают, потому обрыв связи )

Всего записей: 10089 | Зарегистр. 12-10-2001 | Отправлено: 16:22 28-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS
ты об SQL имеешь хоть какое-то представление?
очень похоже.
 
получить таблицу из двух столбцов |  
        отфильтровать строки по критерию (где значение в поле/столбце Source соответствует регэкспу, заданному параметром $remote) |  
                выбрать значение из столбца Destination
 
Научиться стоит того: это ключ к могуществу!
В любой винде изкаробки!!
 
--
Насчёт регэкспа я возможно погорячился.
Имелось в виду что  
   'http://amlpages.com/Source/pwdcrack.zip' -match 'pwdcrack.zip'
 
и потому командлет Where-Object выберет эту строку.

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 17:17 28-08-2017 | Исправлено: LevT, 17:24 28-08-2017
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS

Цитата:
Опять ребусы...


Цитата:
Я понял (теоретически), что ты показал, но в мозгу нету тех функций и понимания, как они работают, потому обрыв связ

Это просто особенность общения с LevT
Менторским тоном и высокопарно запудрить мозг визави
 
Но, по сути, он прав, в общем-то скрипт уже готов и должен работать (удивлен второй раз, что есть таки практическая помощь!)... если отбросить всю ту шелуху, что он тут иногда пишет, когда его заносит слишком высоко
 
Вот этого достаточно:

Код:
function Get-Newer
{
    [CmdletBinding()]
    Param
    (
        # Remote files' URLs
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true)]
        $Source,
 
        # Local files' paths
        [Parameter(ValueFromPipelineByPropertyName=$true)]
        $Destination
    )
 
    Process{
        try {
            $okay = $false
            $localfile = $PSItem.Destination | Get-Item -ErrorAction Stop   #если ошибка доступа к файлу или его нет
            [DateTime]$localtime = $localfile.LastWriteTime
 
            #возможные исключения в .Net методах Create и GetResponse не обработаны
            [DateTime]$remotetime = [Net.HttpWebRequest]::Create($PSItem.Source).GetResponse() | Select -ExpandProperty LastModified
            if ($remotetime -gt $localtime){
                $okay = $true
            } else {
                Write-Warning ("{0} is not newer, skipping" -f $localfile.FullName)
            }
        } catch {    # обработано только исключение "нет такого локального файла": ошибка доступа провалится сюда же
            $okay = $true
        }
 
 
        if ($okay){
            Write-Verbose ("Included: {0}" -f $PSItem.Source)
            Write-Output $PSItem
        }
    }
 
}
 
Import-CSV C:\soft.txt|Get-Newer | Start-BitsTransfer

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 17:54 28-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
практическую помощь я вижу в том, чтобы научить:
 
 одних писать повторно используемые функции,  
 
 а других хотя бы "складывать кирпичики" на PS
ну, и понимать, какого рода кирпичиков им недостаёт и потому их надо искать или заказывать у первых

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 18:18 28-08-2017 | Исправлено: LevT, 18:23 28-08-2017
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
практическую помощь я вижу в том, чтобы научить

У тебя благородная миссия - нести знания в массы, следовать ей необходимо неукоснительно  20-08-2017

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:55 28-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Это не я!  
 это Дон Джонс придумал структурировать таким образом пользователей PS.
И похоже, что оно реально эффективно работает: гугли PSUG (Powershell User Group)

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 19:05 28-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Я же говорю, что слышать тебя слышу, но знаний по всем этим командлетам и функциям не достает.
YuS_2
Если в том виде, что ты дал, то сИравно качает по-новой, хотя локальные файлы присутствуют.

Всего записей: 10089 | Зарегистр. 12-10-2001 | Отправлено: 19:14 28-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS

Цитата:
но знаний по всем этим командлетам и функциям не достает.  

 
для начала тебе нужны знания по их сочетаемости.
В нашем здешнем контексте нужно, чтобы ты сам догадался, чтО именно нужно запустить.  
Даже если и не понимаешь, каким образом нужные тебе штуки работают.

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 19:46 28-08-2017 | Исправлено: LevT, 20:35 28-08-2017
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS

Цитата:
Если в том виде, что ты дал, то сИравно качает по-новой, хотя локальные файлы присутствуют.

Есть одно подозрение...
Для проверки добавь такую строку:

Код:
if ($remotetime -ne $localtime){write-warning 'localtime != remotetime'} else {write-warning 'ok'}

перед этой:

Код:
 if ($remotetime -gt $localtime){
...

Каков будет результат?

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:09 28-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Типа работает... Ура! А типа, потому как скрипт живет какой-то своей жизнью, после удаления локального\ных файлов.
Например, локальные файлы все на месте, вот полный файл C:\soft.txt
и после запуска скрипта, повторного скачивания нет. Но в окне PowerShell, наблюдаем такой вывод:

Код:
 
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\pwdcrack.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\TextReplace.7z is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\DirectoryMonitor2_Portable.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: localtime != remotetime
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\SysinternalsSuite.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
 

и далее до конца все ровно, т.е.
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: Путь_ к_файлу is not newer, skipping
====
Хорошо. Удаляем локальный файл pwdcrack.zip, путь которого в C:\soft.txt прописан в первой строке и проверяем реакцию скрипта.
При выполнении скрипта, удаленный файл сразу скачивается, а далее начинается барабашка, вот вывод в окне PowerShell:

Цитата:
 
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\TextReplace.7z is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\DirectoryMonitor2_Portable.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: localtime != remotetime
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\SysinternalsSuite.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\sumo.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\WContig.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\GetWindowText.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\GetWindowText_x64.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\stduviewer.exe is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\Redwood.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\removedrive.zip is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\xyplorer_full_noinstall.zip is not newer, skipping
 

и тут выполнение скрипта приостанавливается с моргающим курсором. Ждем. После первой минуты
ожидания, что-то снова скачивается, но сценарий все стоит на том же месте (курсор продолжает моргать). Ждем еще 1-2 минуты и снова что-то скачивается.
В окне вывода все на том же месте. Ждем. Снова качает, в окне вывода пошли подвижки и добавились строки:

Цитата:
 
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\uiso9_pe.exe is not newer, skipping
ПРЕДУПРЕЖДЕНИЕ: ok
ПРЕДУПРЕЖДЕНИЕ: E:\WgetSoft01\ProxifierPE.zip is not newer, skipping
 

Снова минуты 2 моргающий курсор , а после бац и строка приглашения ввода команд, т.е. оставшиеся
строки (видать те, файлы из которых были повторно скачаны) между ...xyplorer_full_noinstall.zip и uiso9_pe.exe, а равно первая и последняя строки в C:\soft.txt... не были отображены в окне вывода.
Складывается впечатление, если какого то локального файла нет в наличии, то "замыкает" работа скрипта на проверке обновления других файлов с удаленных серверов.
Сорри, если не внятно выразился.

Всего записей: 10089 | Зарегистр. 12-10-2001 | Отправлено: 08:47 29-08-2017 | Исправлено: KLASS, 09:32 29-08-2017
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS

Цитата:
Но в окне PowerShell, наблюдаем такой вывод:

В случае, когда localtime не равно remotetime, как раз, должно происходить скачивание и замена файла...
Чтобы стал полностью наглядным вывод скрипта, ещё необходимо в самое его начало добавить строку:

Код:
$VerbosePreference = "Continue"

 

Цитата:
если удалить 1,2,3 локальных файла, то начинаются заметные тормоза при выполнении скрипта и при  
этом, какие то файлы скачиваются повторно, а какие то нет.

непонятных действий быть не должно,  
ok - при равенстве времени изменения файлов, удаленного и локального (скачивания нет)
localtime != remotetime - время отличается и при условии, что время изменения файла на сервере больше времени локального файла либо локальный файл отсутствует, будет осуществляться скачивание.
 
По тормозам - видимо, зависит от того, какой канал связи, что отдает сервер, в общем от командлета Start-BitsTransfer и возможно, ещё от .net платформы, в момент получения времени изменения удаленного файла.
Можно посмотреть в какой момент происходит затык, добавив пронумерованных варнингов...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 09:44 29-08-2017 | Исправлено: YuS_2, 09:47 29-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще интереснее будет, если запустишь  
Import-CSV C:\soft.txt | Get-Newer -Verbose | Start-BitsTransfer
 
а пожалуй лучше в начала скрипта  
$VerbosePreference = 'Continue'
(это подействует не только на нашу функцию, но и на BitsTransfer)
 
 
Добавлено:
YuS_2

Цитата:
непонятных действий быть не должно,  

 
Можно уточнить, посмотрев трассировку происходящего в трубе.
Хотя по идее там всё как раз синхронно.
 
Непонятки должны начать случаться, если мы решим добавить асинхронности.
 
 
Добавлено:
KLASS

Цитата:
и тут выполнение скрипта приостанавливается с моргающим курсором. Ждем. После первой минуты  
ожидания, что-то снова скачивается, но сценарий все стоит на том же месте (курсор продолжает моргать).

 
 
Кажись, понял.
Это как раз нормальная работа трубы
 
Прежде чем начнёт работу Start-BitsTransfer, Get-Newer успевает умотать далеко вперёд.
Поскольку же Start-BitsTransfer вызывается синхронно, тот блокирует трубу, т.е. труба ждёт сигнала о полном завершении скачивания очередного файла.
 
Итак, плодотворная идея состоит в том, чтобы вызывать Start-BitsTransfer асинхронно.

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 09:53 29-08-2017 | Исправлено: LevT, 10:11 29-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
YuS_2
Добавил строку $VerbosePreference = "Continue" в начало скрипта.
1. Локальные файлы все на месте, запускаемся
Перед каждым "ПОДРОБНО: Included:..." есть ощутимый затык по времени и файл (далеко не все) скачивается повторно.
2. Все тоже, только добавил
Start-BitsTransfer -Asynchronous
Картина такая, сопровождаемая теми же затыками по времени.
При этом осталось не удаленных (не_переименованных) 7 временных файлов *.tmp
3. Удалил первый файл из списка pwdcrack.zip и с параметром -Asynchronous
При этом затыка по времени, при скачивании удаленного файла не было, но далее все теже значительные задержки по времени.
Картина
и уже 9 файлов бла-бла.tmp.
Если тупо оставить одну строку без проверки на изменения
Import-CSV C:\soft | Get-Newer | Start-BitsTransfer,
то качает быстрее, нежели с проверкой на изменение каждого файла.
Т.е. хотел избавиться от повторного скачивания, дабы сэкономить время, а получил увеличение по времени в разы.
Пошик, АднАкА... медленный какой-то, или...

Цитата:
Это как раз нормальная работа трубы


Всего записей: 10089 | Зарегистр. 12-10-2001 | Отправлено: 11:35 29-08-2017
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS
Кажется, я недообъяснил, а ты не понял.
 
Чтобы труба битстрансфером не заблокировалась, асинхронно надо запускать битстрансферы по одному, по мере готовности входной информации: тогда get-newer продолжит выполняться не ожидая завершения очередного битстрансфера.
А если их запускать асинхронно всем скопом, то результат появится только в самом конце (когда завершится последний битстрансфер)  
 
Вот это действительно знание из книжек.
Мне до сих пор не доводилось проверить как это работает, из-за отсутстсвия живого примера.
 
Благодарю тебя за него!
Дайкась свой файл soft.txt
 
 
 
Добавлено:
 
Тот же самый эффект кстати наблюдается, если где-то в середине трубы используются переменные-аккумуляторы в цикле, типа:
$array = $array.Add($current)
 
Всё пролетает обычно незаметно - но вообще так делать нехорошо.  
 
 
Добавлено:
 
Ну, и конечно же никто не мешает приземлить трубу на середине.
 

Код:
 
$newer = Import-CSV C:\soft.txt | Get-Newer
$newer  | Start-BitsTransfer  
 

 
Но это неинтересно, интересно научиться понимать работу трубы.
Согласен?

Всего записей: 15331 | Зарегистр. 14-10-2001 | Отправлено: 12:23 29-08-2017 | Исправлено: LevT, 12:46 29-08-2017
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT

Цитата:
Дайкась свой файл soft.txt

Чуть выше полный выкладывал

Цитата:
Согласен?

Разумеется, только, если пошик такой медленный (о его медленности уже слышал здесь на форуме), то нафиг, нафиг )

Всего записей: 10089 | Зарегистр. 12-10-2001 | Отправлено: 12:55 29-08-2017
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell
KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru