Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Программирование командных BAT-файлов в Windows»Стр 1 из 5Следующая ⇒
Лабораторная работа «Перенаправление ввода/вывода. Программирование командных BAT-файлов в Windows» Перенаправление ввода-вывода Назначение потоков Ввод/вывод в операционных системах (как MS-DOS, так и UNIX) может быть организован двумя принципиально разными способами. Первый способ - это прямое программирование устройств ввода/вывода (дисковода, экрана, модема, клавиатуры). Он может быть организован на различных уровнях (непосредственное программирование устройств, использование сервисных средств операционной системы, смешанный подход и т.д.), но суть его при этом не меняется. Каждая программа, написанная с использованием этого способа, может работать только с этим устройством и ни с каким другим. В настоящее время используется именно этот способ. Именно с помощью этого подхода (точнее, путем "косвенного" программирования периферийных устройств через драйверы этих устройств) и реализован классический WIMP - интерфейс, о котором уже было много сказано в предыдущей главе. Он позволяет создавать красивые и довольно содержательные средства общения с пользователем (меню, окна и тому подобное), а современные технологии позволяют программе при установке автоматически настраиваться на установленное на компьютере оборудование. Но у этих систем есть недостаток: они не могут принять данные с устройств и передать данные устройствам, для работы с которыми они не созданы. Например, нельзя данные вводить с модема, если программа работает только с клавиатурой. Чтобы осуществить это, используют другой способ: ввод/вывод с использованием потоков. В этом случае каждое устройство рассматривается операционной системой как файл, куда можно поместить и откуда можно взять информацию. Так же, как информация, записанная в файл, рассматривается операционной системой как единое целое, не зависимо от способа записи его на диске, так и физическая реализация процесса ввода/вывода информации устройством никак не отражается на работе пользователя. Ограничение потоков. Как правило, эффект, достигаемый прямым программированием устройств, невозможно реализовать на уровне потоков (нельзя даже поменять цвет символов, не говоря уж о применении графики!) Но выигрыш в унификации процессов иногда оказывается более существенным, например, при работе с текстовой информацией, при автоматическом проведении эксперимента и тому подобное.
Определение и классификация потоков. Поток, скажем так, представляет собой некоторый буфер в памяти, куда поступает или откуда выбирается информация. Существуют следующие стандартные потоки: 1. Стандартный поток ввода - это обычно клавиатура. 2. Стандартный поток вывода - это обычно монитор. 3. Стандартный поток вывода ошибок и диагностических сообщений (стандартный поток ошибок) - это обычно дисплей (монитор). Переназначение потоков. Использование потоков не имело бы никаких преимуществ перед прямым программированием устройств, если бы их нельзя было переназначать с одного устройства на другое, а также переназначить ввод/вывод информации устройством в файл. Для этого используются следующие конструкции (в DOS и UNIX). - переназначает стандартный поток вывода другому устройству (или файлу). Если этот файл существует, он очищается, и на его место записывается новая информация. Используется в DOS и UNIX. В UNIX те же действия может осуществлять конструкция 1>. - То же самое, но если файл существует, то новая информация записывается в конец этого файла. Используется в DOS и UNIX. Для UNIX также можно использовать конструкцию 1>>. Конвейерная обработка. Символы переадресации очень удобны, но иногда бывает необходимо организовать последовательность программ, выполняющих обработку информации, причем результат редыдущей программы является исходным для следующей. При этом промежуточные данные желательно никуда не записывать. Чтобы организовать такую обработку, используют знак '|' конвейера. Команды-"цепочки" такой обработки данных просто записываются в одну строку в порядке их вызова для обработки данных, и отделяются одна от другой знаком конвейера '|'. Пример: sort < mylist | more. В этом примере данные из файла mylist сортируются программой sort и постранично выводятся на экран программой more. В UNIX тоже возможна переадресация потока с одновременным выводом данных на экран, и даже переадресация на два разных устройства. Для переадресации стандартного вывода в файл с одновременной выдачей информации на экран используется команда tee. Например, команда cat в UNIX позволяет просматривать файл. Следующая конструкция:
cat first | tee second копирует файл first в файл second, одновременно показывая его на экране. Резюме. Итак, в этом разделе Вы кратко познакомились с понятием потока, дескриптора файла в интерфейсе ввода/вывода операционных систем, а также научились перенаправлять потоки операционных систем. Понятие потока тесно связано с понятиями "буфер ввода/вывода" и "кэширования диска". Об этих понятиях уже говорилось во втором выпуске данной серии. В этой части объяснилось назначение этих элементов. Также Вы познакомились с понятием "конвейер" и правилами его использования. Напоследок приводим таблицы, в которой кратко приводятся данные, описанные в этом разделе.
Переменные окружения При загрузке ОС Windows в оперативной памяти постоянно хранится набор т.н. переменных окружения (environment variables). Хотя в Windows есть более совершенный способ для хранения системных значений – реестр, многие программы по-прежнему используют переменные окружения. Наиболее важные переменные хранят системный путь для поиска (PATH), каталог запуска Windows (WINDIR), место хранения временных файлов (TEMP). Переменные устанавливаются с помощью команды SET [переменная=[строка]] Запуск SET без параметров приводит к выводу списка переменных среды. Для получения их значений (всегда строки) нужно имя соответствующей переменной заключить в символы «%», например: %TEMP%. Основные команды Остановимся подробнее на командах работы с файловой системой: ATTRIB, CD, COPY, XCOPY, DIR, MKDIR, RMDIR, DEL, DELTREE, REN, MOVE, SUBST, VOL, LABEL. ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [[диск:][путь]имя_файла] [/S] Используется для просмотра или установки атрибутов файлов. В Windows 9x можно использовать 4 атрибута: Read-Onlу (R) – только для чтения; System (S) – системный; Archive (A) – архивный; Hidden (H) – скрытый. Установка атрибута проиводится ключом «+», снятие – «-». Ключ «/S» применяется для обработки файлов во всех подкаталогах указанного пути. Например, сделать все Word-файлы в каталоге «Мои документы» доступными только для чтения: ATTRIB +R “C:\Мои документы\*.doc”. Атрибуты фалов можно просмотреть/поменять в файловых менеджерах или проводнике (пункт «Свойства» в контекстном меню по правой клавише). CHDIR (CD) [диск:] [путь\] Текущий каталог можно изменить с помощью команды CD. Например, переход в корневой каталог диска – CD \, на уровень выше – CD.., в каталог «Мои документы» - CD ”\Мои документы”. В Windows NT с помощью ключа /D можно сменить не только текущий каталог, но и диск, например: CD /D D:\Texts. Кроме того, в Windows NT можно не заключать имена длинных каталогов в кавычки – CD.\Мои документы.
COPY [/A | /B] источник [/A | /B] [+источник [/A | /B] [+ …]] [результат [/A | /B]] [/V] [/Y | /-Y] Наиболее часто используемая команда для копирования одного или нескольких файлов. Описание ключей сведено в таблицу:
Действие ключа /B означает копирование всего файла побайтно, а ключ /A приводит к копированию только данных, предшествующих первому символу конца файла. В качестве источника или результата при копировании можно указывать имена не только файлов, но усиройств компьютера: RN – принтер, LPT1-LPT3 – соответствующие параллельные порты; AUX – устройство, присоединяемое к последовательному порту 1; COM1-COM3 - соответствующие последовательные порты; CON – терминал (при вводе – это клавиатура, а при выводе – монитор); NUL – пустое устройство (все операции игнорируются). Например, для печати файла на принтере можно ввести команду COPY abc.txt PRN, для создания файла COPY CON my.txt (для конца файла ввести <CTRL>+<Z>). Команда COPY может объединять (склеивать) несколько файлов путем использования групповых знаков «*» и «?» (COPY /B *.dat all.dt) или знака конткатенации «+» (COPY /B 1.txt+2.txt 3.txt). Здесь ключ /B используется для предотвращения усечения соединяемых файлов, т.к. по умолчанию файлы считаются текстовыми. Среди нелостатков команды COPY надо отметить невозможность копирования скрытых истемных файлов, замены файлов с атрибутом «Read Only», а также копирования открытых (занятых) файлов (в этом случае процеес просто прерывается). Некоторые из этих проблем можно решить с помощью утилиты XCOPY. XCOPY источник результат [/A | /M] [/D[:дата]] [/P] [/S [/E]] [/W] [/C] [/I] [/Q] [/F] [/L] [/H] [/R] [/T] [/U] [/K] [/Y | /-Y] Команда XCOPY работает только с файлами и каталогами (а не с устройствами). Используемые ключи рассмотрим в табличном виде:
При использовании команды XCOPY внутри пакетных файлов по переменной ERRORLEVEL (см. в след. разделе) можно анализировать код выхода (завершения) команды (0 – без ошибок, 1 – файлы не найдены, 2 – прерывание по <CTRL>+<C>, 4 – не хватает места, ошибка в назначении или синтаксисе, 5 – ошибка записи на диск). DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N] [/O[[:]порядок]] [/P] [/Q] [/S] [/T[[:]время]] [/W] [/X] [/4] Выводит информацию о содержимом дисков и каталогов. При использовании без ключей выводит метку диска, имена (в коротком и длинном вариантах) файлов и подкаталогов, находящихся в текущем подкаталоге, а также дату и время их последней модификации. В завершении выводится общее число файлов в каталоге, их объем и размер свободного пространства. Ключи команды DIR позволяют задать различные режимы расположения, фильтрации и сортировки выводимой информации:
Стандартный набор ключей можно записать в переменную среды DIRCMD. Для отмены их действия введите в команде те же ключи с префиксом "-", например: /-W. Команда DIR (так же как и другие) поддерживает перенаправление ввода-вывода (символы «>» и «>>»), например команда:
DIR “C:\Мои документы” /W/O:N > PRN выполняет печать в широком формате в алфавитном порядке на принтер. MKDIR (MD) [диск:]путь RMDIR (RD) [диск:]путь Применяются ссотвественно для создания нового каталога и удаления существующего пустого каталога. Команда MKDIR не будет выполнена, если каталог или файл с заданным именем уже существуют, а RMDIR – если удаляемый каталог не пустой. В Windows NT появилась возможность удалять подкаталоги (RD /S), и создавать полный путь – MD \A\B\C\D. DEL [диск:][путь]имя_файла [/P] ERASE [диск:][путь]имя_файла [/P] Удаляют один или несколько файлов. Ключ /P означает выдачу запроса на удаление (при задании удаления всех файлов DEL *.* или DEL. запрос будет всегда). В Windows NT добавлены параметры для удаления файлов с атрибутом «Только для чтения» (/F), подкаталогов (/S), отмены подтверждений (/Q), а также удаления файлов, не имеющих заданных атрибутов (/A:атрибуты). DELTREE [/Y] [диск:]путь Используется для удаления каталога вместе со всеми подкаталогами и файлами. Ключ /Y используется для отключения запроса на подтверждение. RENAME (REN) [диск:][путь][каталог1 |файл1] [каталог2 | файл2] Переименовывает файлы или каталоги. Так же как и в команде DEL можно использовать групповые символы «*» и «?», например: REN *.txt *.doc. В этой команде нельзя указать другой диск или каталог для результата – для этих целей надо использовать команду MOVE. MOVE [/Y | /-Y] [диск:][путь]имя_файла1[,…] рез_файл MOVE [/Y | /-Y] [диск:][путь]каталог1 каталог2 Эта команда перемещает и переименовывает файлы или каталоги. SUBST [диск1: [диск2:]путь] Сопоставляет заданному пути имя виртуального диска. Часто нужно для инсталляции программ (эмуляции корневого каталога CD). Например: SUBST F: C:\INSTALL\DELPHI5. Ключ /D используется для удаления ранее созданного виртуального диска: SUBST F: /D. SUBST без параметров выводит текущий список виртуальных дисков (нельзя назначать их на сетевые каталоги). VOL [диск:] LABEL [диск:][метка] Команды выводят и задают метку тома. Командные bat-файлы Командный (пакетный) файл в Windows 9x – это обычный текстовый файл с расширением bat, в котором записаны допустимые команды ОС, а также некоторые инструкции (ключевые слова) для алгоритмизации действий. Например, deltmp.bat удалит все временные файлы в каталоге Windows\Temp: C: \ CD %TEMP% ATTRIB –R *.tmp DEL *.TMP Основной командой для вывода информации в пакетных файлах служит: ECHO [сообщение] С учетом перенаправления может выводить сообщения куда угодно (порты, принтер и т.п.). Например, ECHO Привет! > hi.txt направляет сообщение в текстовый файл. По умолчанию команды пакетного файла перед исполнением выводятся на экран, что не очень эстетично. С помощью команды ECHO OFF можно отключить дублирование вывода команд на экран. ECHO ON восстанавливает режим дублирования. Кроме этого, можно отключить дублирование отдельной строки, если предварить ее символом «@». И, наконец, можео вывести пустую строку комбинацией ECHO. (с точкой в конце). @ECHO OFF ECHO Привет! ECHO. ECHO Пока … При запуске командных файлов в командной строке можно указывать произвольное число парметров, которые затем можно использовать внутри пакетного файла. Для доступа к параметрам применяются символы %0 – имя файла, %1-%9 – значения первых девяти парметров соответственно. Например, имеется командный файл copier.bat следующего содержания: @ECHO oFF CLS ECHO Файл %0 копирует каталог %1 в %2 XCOPY %1 %2 /S При запуске его из командной строки с 2 параметрами: copier.bat C:\Programs D:\Backup на экран выводится сообщение «Файл copier.bat копирует каталог C:\Programs в D:\Backup» и происходит соответствующее копирование. При необходимости можно использовать более девяти параметров командной строки с помощью команды SHIFT, которая изменяет значения замещаемых параметров с %0 по %9, копируя каждый параметр в предыдущий. Значение %1 – в %0, %2 в %1 и т.д., 10 параметр в %9. Команда, обратная SHIFT, отсутствует, поэтому восстановить параметры уже не удастся. Кроме того, в командных файлах можно использовать переменные окружения и объявлять собственные с помощью команды SET. Все переменные рассматриваются как строки и в Windows 9x над ними нельзя производить арифметические действия (в отличие от NT), а только конкатенацию (просто слитно 2 переменные без знака «+»). Например, в результате выполнения командного файла: SET A=Первый SET B=Второй SET C=%A%%B% ECHO Переменная С=%С% на экран выведется «Переменная С=ПервыйВторой». Для управления выполнением командных файлов существуют команды приостановки, перехода, условного ветвления, циклов и вызова внешних командных файлов. Для того, чтобы прервать выполнение командного файла, надо нажать <CTRL> +<C> или <CTRL>+<Break> (в Windows NT есть команда выхода EXIT /B). Для приостановки с выдачей запроса на нажатие любой клавиши есть команда PAUSE, которую рекомендуется использовать перед выполнением потенциально опасных действий. Например: ECHO Сейчас будут удалены все файлы в каталоге C:\Мои документы PAUSE DEL “C:\Мои документы\*.*” Для организации циклов используется конструкция: FOR %%переменная IN ( множество ) DO команда [параметры] Отличие от классических языков программирования в том, что не происходит регулярного приращения счетчика, а вместо этого используется заданный список значений в параметре множество. Скобки здесь обязательны, внутри которых одно или несколько строковых значений, разделенных запятыми. Например: @ECHO OFF FOR %%i IN (Раз, Два, Три) DO ECHO %%i напечатает следующее: Раз Два Три В качестве переменных цикла можно использовать лишь имена, состоящие из одной буквы. Как видите нет командных скобок (типа begin end), поэтому весь цикл должен быть записан в одной строке, вложенные циклы не допускаются. В параметре множество можно представить одну или несколько групп файлов. Например, для вывода всех файлов с расширениями *.doc и *.txt: FOR %%f IN(C:\TEXT\*.doc C:\TEXT\*.prn) DO ECHO %%f >> list.txt Из одного командного файла можно вызвать другой просто указав его имя. Однако в этом случае управление назад не вернется, для этого существует команда CALL, с помощью которой можно в командных файлах организовать подобие подпрограмм. Например, командный файл proc.bat: @ECHO OFF ECHO Записываем файл %1.txt ECHO Параметр вызова: %1 > %1.txt можно вызвать в другом пакетной файле: FOR %%i IN (Первый, Второй, Третий) DO CALL proc.bat %%i в результате proc.bat вызывается 3 раза и создает 3 файла – Первый. txt, Второй. txt и Третий.txt с соответствущим текстом. Командный файл может содержать метки, начинающиеся с двоеточия («:») и команды GOTO перехода к этим меткам. Имя метки задается набором символов, следующих за двоеточием до первого пробела или конца строки. Например: @ECHO OFF GOTO Label1 REM Продолжение выполнения DIR C помощью команды IF в пакетных файлах можно выполнять обработку условий 3 типов: 1) IF [NOT] строка1==строка2 команда Условие считается истинным (обратите внимание на 2 знака равно) при точном совпадении обеих строк (регистр имеет значение). Строки могут быть литеральными (кавычки для них не требуются) или представлять значения переменных. Например: IF %1%==Петя ECHO Привет, Петя! Для предотвращения синтаксических ошибок в случае отсутствия переменных или параметров, рекомендуется при сравнении строк приписывать им вначале какой-нибудь символ, например: IF -%MyVar%==-C:\ ECHO OK! 2) IF [NOT] EXIST файл команда Проверка существования заданного файла (кавычки для имени также не требуются, кроме длинных). Например: IF NOT EXIST C:\autoexec.bat ECHO У вас нет файла автозагрузки! IF EXIST “C:\Мои документы\Работа.doc” ECHO Все в порядке! 3) IF [NOT] ERRORLEVEL число команда Условие считается истинным, если последняя запущенная программа или команда завершилась с кодом возврата, равным либо превышающим указанное число. Например: xcopy my.txt c:\ > nul Goto EndBatch :ErrOccurred echo При выполнениеи команды возникла ошибка! :EndBatch К сожалению в командных файлах нет возможности организоовать полноценный диалог с пользователем путем ввода строк с клавиатуры. Единственное средство – команда CHOICE, которая выводит подсказку и ждет выбора пользователем варианта из указанного набора клавиш. CHOICE [/C[:]варианты] [/N] [/S] [/T[:]c,nn] [текст] Если в команде не задается текст, то пользователь видит на экране только подсказку. Рассмотрим подробно ключи этой команды:
После выполнения команды CHOICE переменная ERRORLEVEL приобретает значение, равное номеру варианта ответа, что позволяет использовать команду IF для организации ветвления. Если происходит ошибка, CHOICE возвращает 255, прерывание по <CTRL>+<C> или < CTRL >+<Break> - 0. В качестве примера рассмотрим простейшее меню: @ECHO OFF ECHO Выберите режим ECHO 1 - Простой ECHO 2 - Расширенный ECHO. ECHO Выход из меню GOTO Done :Choice1 ECHO Выбран пункт 1 GOTO Done :Choice2 ECHO Выбран пункт 2 GOTO Done :Done Упражнения 1. Пусть имеется текстовый файл protokol.txt, в котором хранится журнал обработанных файлов в следующем формате: <имя файла> <дата> <время> Слово дата здесь начинается в каждой строке с двадцатой позиции. Необходимо написать командный файл, с помощью которого сделать выборку из этого файла (т. е. создать новый текстовый файл с нужной информацией) за заданный месяц (мм) и год (гггг) в файл ммгггг-.txt, сформированный файл упорядочить по дате обработки. Нужные месяц и год указать как параметры командной строки. Решение: Практически все нужные действия выполняются с помощью конвейеризации команд find и sort: @ЕСНО OFF GOTO End :NoParam ECHO He заданы необходимые параметры командной строки! PAUSE :End 2. Написать командный файл, который будет копировать из текущего каталога все файлы с расширением txt, кроме одного файла, указанного в качестве второго параметра командной строки, в каталог, указанный первым параметром. Если имя каталога, в который должно производиться копирование, не задано, то вывести сообщение об этом и прервать выполнение файла. Решение: Для выполнения поставленной задачи можно перебрать в цикле все файлы с расширением txt, проверяя перед копированием имя каждого из этих файлов: @ЕСНО OFF GOTO End :NoDir ECHO He указан каталог для копирования! PAUSE :End 3. Задание аналогично второму упражнению. Дополнительные требования: а) переписывать только те файлы, которые новее одноименных в каталоге - приемнике, б) не прерывать копирование в случае возникновения ошибки, в) записывать в файл logcopy.txt имя каждого копируемого файла и результат выполнения операции для него. Другими словами, файл logcopy.txt должен быть примерно таким: Успешно: а.txt Ошибка: b.txt Успешно: с.txt Решение: В этом упражнении нужно создать два пакетных файла. В основном файле работает такой же цикл for, как и в предыдущем упражнении, однако вместо непосредственного выполнения команды copy здесь вызывается командный файл 3_1. bat: @ЕСНО OFF GOTO End :NoDir ECHO He указан каталог для копирования! PAUSE :End Вызываемый в цикле файл 3_1.bat имеет следующее содержимое: @ЕСНО OFF REM Копирование файла XCOPY %1 %2 /D /С > NUL GOTO End :Success CLS IF -%1==- GOTO NoDir RЕМ Вывод меню на экран ECHO A - На экран ECHO Б - В файл C:\catalog.txt ECHO В - На принтер CLS ECHO Выбор не был сделан. GOTO End :DirToCon DIR %1 | MORE GOTO End :DirToFile DIR %1 > C:\catalog.txt GOTO End :DirToPrn DIR %1 > prn GOTO End :NoDir ECHO He указан каталог для сканирования! PAUSE :End Задания В соответствии с номером студента по списку в журнале преподавателя разработать пакетный bat-файл (см. таблицу). В пакетных файлах предусмотреть сообщение имени, назначения, применения и автора пакетного файла (при пустой командной строке и по ключу /?), контроль верности командной строки, наличие требуемых файлов и сохранность имени пакетного файла. Текущий каталог не изменять, если это специально не оговорено. Там, где необходимо, имена файлов указывать с полным путем и диском. С клавиатуры при работе пакетного файла вводить только числа, строковые данные выбирать либо из меню, либо передавать в командной строке.
ЛИТЕРАТУРА 1. Финогенов Ms-Dos: Самоучитель по системным функциям, Горячая линия-телеком, 2001, 382 стр. 2. Панкратов Операционная система MS-DOS 6.22: Справочное пособие, Познавательная книга плюс, 2001, 224 стр. 3. Губин А. Работа в Ms-Dos для всех: Практическое пособие, Радио и связь, 1993, 160 стр. 4. Франкен Г., Молявко С. MS-DOS 6.2 для пользователя, Киев, BHV, 1994, Москва, БИНОМ, 1994. 5. Фигурнов В. IBM PC для пользователя, г.Уфа, НПО “Информатика и Компьютеры”, 1993. 6. Руководство по программированию под управлением MS DOS:Пер.с фр./Пьеро Ф.,Люкзак Ж.-Л.,Рейко Ф.;Под ред.Пьеро Ф..-М.:Радио и связь,1995.-544с.
Лабораторная работа «Перенаправление ввода/вывода. Программирование командных BAT-файлов в Windows»
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 1212; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.81.58 (0.301 с.) |