шпаргалка по написанию bash скриптов, по ссылке – оригинальная статья на хабре · GitHub

Почему скрипты так важны в java?

Сначала давайте вспомним, что такое скрипты:

Скрипт — это программа, написанная для определённого runtime-окружения, которая автоматизирует исполнение задач или команд, которые человек может исполнять поочерёдно.

Из этого общего определения мы можем вывести простое определение скриптового языка — это язык программирования, использующий высокоуровневые конструкции для интерпретации и исполнения по одной команде (или команд) за раз.

Скриптовый язык использует серии команд, записанных в файле. Часто такие языки являются интерпретируемыми (а не компилируемыми) и придерживающимися процедурного стиля программирования (хотя некоторые скриптовые языки также обладают свойствами объектно-ориентированных языков).

В целом скриптовые языки легче в освоении и быстрее в наборе кода по сравнению с более структурированными компилируемыми языками вроде Java, C и С . К серверным скриптовым языкам относятся Perl, PHP и Python, а на клиентской стороне — JavaScript.

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

Тем не менее, Java уже исполнилось 24 года, его использует около 10 млн разработчиков по всему миру. В последних релизах добавили ряд новых возможностей, чтобы молодым программистам было легче изучать этот язык, а также чтобы пользоваться функциями языка и API без компилирования и IDE. Например, в Java SE 9 появился инструмент JShell (REPL), который поддерживает интерактивное программирование.

А с выходом JDK 11 этот язык получил возможность поддержки скриптов, поскольку теперь вы можете исполнять код с помощью простого вызова команды java!

В Java 11 есть два основных способа использования скриптов:

  1. Прямой вызов команды java.
  2. Применение *nix-скриптов для командной строки, аналогичных Bash-скриптам.

Первый вариант мы уже рассмотрели, теперь разберёмся со вторым. Он открывает нам много возможностей.

Shebang-файлы: запускаем java как shell-скрипт

Итак, в Java SE 11 появилась поддержка скриптов, включая традиционные shebang-файлы из мира *nix. Для их поддержки не потребовалось спецификации языка.

В shebang-файле первые два байта должны быть 0x23 и 0x21. Это ASCII-кодировка символов #!.. Все последующие байты в файле читаются на основе действующей по умолчанию на данной платформе системы кодировки.

Таким образом, чтобы файл исполнился с помощью встроенного в ОС shebang-механизма, необходимо соблюсти лишь одно требование: чтобы первая строка начиналась с #!.. Это означает, что нам не нужна какая-то особенная первая строка, когда модуль запуска Java явно используется для запуска кода из исходного файла, как в случае с HelloUniverse.java.

Запустим следующий пример в терминале, работающем под macOS Mojave 10.14.5. Но сначала определим важные правила, которым нужно следовать при создании shebang-файла:

  • Не смешивать Java-код с кодом скриптового языка оболочки вашей ОС.
  • Если вам нужно добавить опции виртуальной машины, необходимо после имени исполняемого файла в shebang-файле первой опцией задать --source. К опциям виртуальной машины относятся: --class-path, --module-path, --add-exports, --add-modules, --limit-modules, --patch-module, --upgrade-module-path, а также любые их вариации. Также в этот список могут включить новую опцию --enable-preview, описанную в JEP 12.
  • Вы должны задать версию Java, которая используется в исходном файле.
  • Первая строка файла должна начинаться с shebang-символов (#!). Например:
    #!/path/to/java --source <vеrsion>
  • Применительно к исходным Java-файлам НЕЛЬЗЯ использовать shebang-механизм для исполнения файлов, которые соответствуют стандартному соглашению о наименованиях (заканчиваются на .java)
  • Вы должны пометить файл как исполняемый с помощью команды:
    chmod x <Filеname>.<Extеnsion>.

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

#!/usr/bin/java --source 11
import java.nio.file.*;
import static java.lang.System.*;

public class DirectoryLister {
      public static void main(String[] args) throws Exception {
            vardirName = ".";

            if ( args == null || args.length< 1 ){
err.println("Will list the current directory");
            } else {
                  dirName = args[0];
            }

            Files
            .walk(Paths.get(dirName))
            .forEach(out::println);       
      }
}


Сохраним код в файл с именем dirlist без расширения, а затем пометим его как исполняемый:

mohamed_taman:code$ chmod x dirlist

Запустим файл:

Как интерпретатор java выполняет программу hellouniverse

В JDK 10 модуль запуска Java может работать в трёх режимах:

  1. Исполнение class-файла.
  2. Исполнение основного класса из JAR-файла.
  3. Исполнение основного класса модуля.


А в Java 11 появился четвёртый режим:

  1. Исполнение класса, объявленного в исходном файле.

В этом режиме исходный файл компилируется в памяти, а затем выполняется первый класс из этого файла.

Система определяет ваше намерение ввести исходный файл по двум признакам:

  1. Первый элемент в командной строке не является ни опцией, ни частью опции.
  2. В строке может присутствовать опция --source <vеrsion>.

В первом случае Java сначала выяснит, является ли первый элемент команды опцией или её частью. Если это имя файла, заканчивающееся .java, тогда система будет считать его исходным кодом, который нужно скомпилировать и запустить. Вы также можете добавлять в Java-команду опции перед именем исходного файла.

Например, если нужно задать путь класса, когда исходный файл использует внешние зависимости.

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

Если файл не имеет расширения .java, то нужно использовать опцию –source, чтобы принудительно перейти в режим работы с исходным файлом.

Это важно в случаях, когда исходный файл представляет из себя «скрипт», который нужно выполнить, а имя файла не соответствует обычным соглашениям о наименованиях исходных файлов с Java-кодом.

С помощью опции –source можно определять версию языка исходника. Об этом мы поговорим ниже.

Определяем уровень исходного кода с помощью опции –source

Есть два сценария использования опции

--source

  1. Определение уровня исходного кода.
  2. Принудительный перевод runtime-среды Java в режим работы с исходным файлом.


В первом случае, если вы не указали уровень исходного кода, за него принимается текущая версия JDK. А во втором случае файлы с расширениями, отличными от .java, можно передавать для компилирования и выполнения на лету.

Давайте сначала рассмотрим второй сценарий. Переименуем Greater.java просто в greater без расширения и попробуем выполнить:

mohamed_taman$ java greater "Mo. Taman"
Error: Could not find or load main class greater
Caused by: java.lang.ClassNotFoundException: greater

При отсутствии расширения .java интерпретатор команд ищет скомпилированный класс по имени, переданному в виде аргумента — это первый режим работы модуля запуска Java. Чтобы это не происходило, воспользуемся опцией

--source

для принудительного переключения в режим работы с исходным файлом:

mohamed_taman$ java --source 11 greater "Mo. Taman"
Hello, Mo. Taman to InfoQ universe!!


Теперь перейдём к первому сценарию. Класс Greater.java совместим с JDK 10, поскольку содержит ключевое слово

var

, но не совместим с JDK 9. Изменим

source10

mohamed_taman$ java --source 10 Greater.java "Mo. Taman"
Hello Mo. Taman to InfoQ universe!!

Снова запустим предыдущую команду, но в этот раз передадим

--source 9

вместо

10

mohamed_taman$ java --source 9 Greater.java "Mo. Taman"
Greater.java:8: warning: as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations or as the element type of an array
var name = args[0];
            ^
Greater.java:8: error: cannot find symbol
var name = args[0];
        ^
  symbol:   class var
  location: class HelloWorld
1 error
1 warning
error: compilation failed


Обратите внимание: компилятор предупреждает о том, что

var

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

var

Всё просто. Теперь рассмотрим использование нескольких классов.

:/>  Диск загружен на 100% в Windows? Все причины нагрузки и что делать?

Работает ли этот подход с несколькими классами?

Да, работает.

Рассмотрим пример с двумя классами. Код проверяет, является ли заданное строковое значение палиндромом.

Вот код, сохранённый в файле PalindromeChecker.java:

import static java.lang.System.*;
public class PalindromeChecker {
      public static void main(String[] args) {
            
            if ( args == null || args.length< 1 ){
                err.println("String is required!!");
                exit(1);
            }
            out.printf("The string {%s} is a Palindrome!! %b %n",
                  args[0],
                  StringUtils
                        .isPalindrome(args[0]));            
      }
}
public class StringUtils {
      public static Boolean isPalindrome(String word) {
      return (new StringBuilder(word))
            .reverse()
            .toString()
            .equalsIgnoreCase(word);
      }
}

Запустим файл:

mohamed_taman:code$ java PalindromeChecker.java RediVidEr
The string {RediVidEr} is a Palindrome!! True

Запустим снова, подставив «RaceCar» вместо «MadAm»:

mohamed_taman:code$ java PalindromeChecker.java RaceCar
The string {RaceCar} is a Palindrome!! True


Теперь подставим «Mohamed» вместо «RaceCar»:

mohamed_taman:code$ java PalindromeChecker.java Taman
The string {Taman} is a Palindrome!! false

Как видите, можно добавлять в один исходный файл сколько угодно публичных классов. Следите только за тем, чтобы основной метод был определён первым. Интерпретатор будет использовать первый класс в качестве стартовой точки для запуска программы после компилирования кода в памяти.

Сценарии для администрирования (часть 1) | system engineering

В работе системного администратора встречается много рутинной работы. Естественно, человек всегда ищет способы автоматизации своей работы. Администратору для решения задач оптимизации своей работы помогают скрипты (сценарии).

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

Скриптовый язык (scripting language) – это язык программирования, разработанный для записи “сценариев”, последовательности операций, которые пользователь может выполнять на компьютере.

То есть скрипты могут повторить практически все операции, которые пользователь выполняет на компьютере:

  • Сконфигурировать систему;
  • Сконфигурировать профиль пользователя;
  • Установить или удалить программу;
  • Собрать статистику работы компьютера или пользователя;
  • Сделать резервные копии файлов;
  • Другие операции.

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

  • нужна прозрачность кода сценария, сценарии обычно распространяются с открытым кодом, и любой пользователь может посмотреть, какие команды будет выполнять сценарий;
  • нужно обеспечить стабильность системы, неправильно написанный скрипт выведет диагностическое сообщение, а не приведёт систему к краху;
  • требуется дать пользователям возможность самостоятельно изменять переменные сценария и процедуры;
  • нужно использовать процедуры определенной программы, которые проще осуществить через сценарии, чем осуществлять интерфейс между приложениями;
  • требуется кроссплатформенность – возможность исполнять сценарий на разных операционных системах или в разных браузерах.

Итак, в зависимости от способа реализации сценария и универсальности использования этого сценария, скрипты делятся на нескольких типов:

  • Универсальные – скрипты, которые выполняются независимо от платформы, такие скрипты требуют компиляции, примеры таких языков: Perl (Practical Extraction and Report Language), Python, PHP (Hypertext Preprocessor).
  • Интегрированные в приложение – это скрипты, которые разработаны и работают только внутри определенной программы, явный представитель этого класса – VBA (Visual Basic for Applications).
  • Оболочки – скрипты, которые работают в специальной среде выполнения команд, членам этой группы являются такие скриптовые языки как sh, bash (Bourne shell), bat (MS-DOS batch).
  • Встраиваемые – это языки, которые можно интегрировать в различные приложения, такие языки имеют жесткие стандарты для того, чтобы любая программа, в которую будет интегрирован сценарий, смогла выполнить этот сценарий, примерами таких языков являются js (Java Script), vbs (Visual Basic Script).

В этой статье я рассмотрю два скриптовых языка: “MS-DOS batch” и ” Visual Basic Script”. Все приведенные примеры я использовал в своей работе, хотя для написания статьи они немного упрощены. Кстати, сценарии очень удобно применять в групповых политиках, в запланированных заданиях и в таком продукте, как Microsoft System Management Server 2003 (MS SMS 2003).

Bat-файлы – это наиболее быстрый и простой способ автоматизации действий пользователя. Такой тип сценариев обычно используется чтобы:

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

В основном bat-файлы применяется для копирования и удаления файлов, составления отчетов, запуска других программ и скриптов. Наиболее часто используемые команды:

  • копирование файлов и каталогов: copy, xcopy;
  • перемещение файлов: move;
  • удаление файлов и каталогов: del, rd;
  • создание каталогов: md;
  • перемещение по файловой системе: cd;
  • информация о содержимом файлов и каталогов: type, dir;
  • запуск оболочки и выход из нее: cmd, exit;
  • вызов внешних приложений, циклы и условия: call, for, goto, if, set;
  • дополнительные команды: at, net, set, cls.

Чтобы получить полный список команд, доступных в Вашей операционной системе, надо вызвать командную строку и выполнить команду “help” (надеюсь, что читатели знают, как запустить командную строку в Windows):

C:>help

Чтобы из команд получился сценарий, нужно построчно написать список команд в текстовый файл и сохранить этот файл с расширением “bat”.

Какими бы примитивными не казались bat-файлы, c помощью них можно сильно автоматизировать работу. Мало того, такие сценарии поддерживают передачу переменных через командную строку. Например, чтобы обработать какой-то файл, нужно, чтобы сценарий знал, какой именно файл нужно обработать. Конечно, можно прописать имя обрабатываемого файла непосредственно в коде, но тогда мы получим неуниверсальный скрипт. Чтобы избежать этого, нужно использовать передачу переменных:

  • в теле сценария использовать обращение к переданной переменной;
  • при вызове скрипта передавать ему переменную или список переменных через пробел.

Тело сценария Test.bat:

REM отключение вывода команд на экран
@echo OFF
REM вывод на экран переданной в переменной
echo %1
REM остановка в ходе выполнения сценария
pause

Вызов сценария:

C:>Test.bat MyParameter

Очень часто в путях к внешним приложениям употребляются пробелы, например, если программа находится в каталоге “Program Files”. В таких случаях путь к файлу должен быть заключен в кавычки, иначе интерпретатор сценария сочтет, что вы ввели две команды, разделенных пробелами. Пример использования кавычек:

call "C:Program FilesMovie Makermoviemk.exe"
call "C:My Foldertest.bat" "C:My Catalogarchive.zip"

В командном языке существует некоторый набор символов, которые всегда трактуются как спецсимволы. К ним, в частности, относятся:

  • операторы перенаправления ввода-вывода <, >, >>;
  • оператор конвейера |;
  • операторы объединения команд ||, & и &&;
  • оператор переменной %…%.

Чтобы применять вышеперечисленные символы в своих целях, их нужно экранировать символом “^”. То есть, если Вам требуется вставить символ в текст своей команды, то это будет выглядеть так:

echo ^<html^>                                    >mytest.html
echo ^<head^>                                   >>mytest.html
echo ^<title^>My test page^</title^>            >>mytest.html
echo ^</head^>                                  >>mytest.html
echo ^<body^>                                   >>mytest.html
echo Hello World!                               >>mytest.html
echo ^</body^>                                  >>mytest.html
echo ^</html^>                                  >>mytest.html

Еще одним полезным свойством символа “^” является перенос строк. То есть, если ваша команды слишком длинные, то это обстоятельство уменьшает удобочитаемость сценария. Чтобы вся команда убиралась в экран редактора, применим перенос строки:

oscdimg -m -n -h -lDeployment -bC:CommonDeploymentDiskwinpe_x86etfsboot.com ^
 C:CommonDeploymentDiskwinpe_x86ISO C:CommonDeploymentDiskwinpe_x86^
 Deployment.iso

Очень часто разработчику необходимо знать путь, откуда сценарий был запущен. В решении этой задачи ему помогают специальные переменные:

  • %~0 – возвращает путь к сценарию, удаляя кавычки
  • %~f0 – возвращает полный квалифицированный путь к сценарию
  • %~d0 – возвращает в букву диска, откуда запущен сценарий
  • %~p0 – возвращает путь к сценарию
  • %~n0 – возвращает имя файла сценария
  • %~x0 – возвращает расширение файла сценария
  • %~s0 – возвращает путь к сценарию в коротком формате
  • %~a0 – возвращает атрибуты файла сценария
  • %~t0 – возвращает в дату и время создания файла сценария
  • %~z0 – возвращает размер файла сценария
:/>  Как устранить ошибку запуска cmd.exe » Ссылки бесплатных программ

Указанные модификаторы можно объединять. Например, чтобы получить полный путь к директории, откуда был запущен сценарий, нужно применить в тексте сценария такой модификатор “%~dp0”:

REM отключение вывода команд на экран
@echo OFF
REM вывод на экран месторасположения файла сценария
echo %~dp0
REM остановка в ходе выполнения сценария
pause

Интерпретатор сценариев таким образом может обработать не только путь к файлу сценария, но и пути, переданные в качестве параметров. Чтобы применить модификаторы к переданному параметру, необходимо указать его порядковый номер в командной строке. Как уже понятно из предыдущего примера, нулевым параметром является сам сценарий, а все остальные переданные переменные нумеруются от 1 до 9:

REM отключение вывода команд на экран
@echo OFF
REM вывод на экран имени файла, переданного в качестве переменной
echo %~nx1
REM остановка в ходе выполнения сценария
pause

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

Обычно каждая команда из сценария выводит результат своей работы в окно консоли. Если необходимо сохранить журнал выполнения скрипта, то для этого используют перенаправление вывода в файл:

  • команда >файл – перенаправить вывод в файл с удалением старого содержимого файла;
  • команда >>файл – перенаправить вывод в файл c дописыванием в конец файла.

Иногда bat-файлы вырастают до довольно больших размеров, тогда перенаправление в файл очень загромождает код сценария – почти каждая строка имеет хвостик типа >>файл. Правильнее было бы перенаправить стандартный вывод в файл, чтобы все, что выводится на экран, автоматически попадало в файл вывода. Сделать это можно следующим образом:

REM отключение вывода команд на экран
@echo OFF
REM установка значения переменной имени файла вывода
set OUTPUT=mytest.html
REM задание вывода работы сценария в файл вывода
if "%STDOUT_REDIRECTED%" == "" (
   set STDOUT_REDIRECTED=yes
   cmd.exe /c %0 %* >%OUTPUT%
   exit /b %ERRORLEVEL%
)
REM тело сценария
echo ^<html^>
echo ^<head^>
echo ^<title^>My test page^</title^>
echo ^</head^>
echo ^<body^>
echo Hello World!
echo ^</body^>
echo ^</html^>

В этом примере сценарий проверяет задана ли переменная окружения STDOUT_REDIRECTED. Если она не установлена, то сценарий перезапускает сам себя, предварительно устанавливая эту переменную и останавливая выполнение остальных команд из тела скрипта. Если переменная STDOUT_REDIRECTED установлена, значит, сценарий уже перезапущен с перенаправленным выводом, и можно перейти к телу сценария. Такое перенаправление дает еще одно преимущество – файл открывается и закрывается только один раз, а всем командам передается ссылка на уже открытый файл.

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

REM отключение вывода команд на экран
@echo OFF
REM перенаправление результатов команд в ноль
copy text.txt test2.txt >nul

Иногда может потребоваться обрабатывать какой-то параметр несколько раз за один проход сценария. Конечно, можно несколько раз написать код для обработки переменной, но более красивым решением было бы применение функций. Функции объявляются и описываются после основной части сценария, вызов функции производится командой call, а выход из нее – exit. Простой пример использования функции:

REM отключение вывода команд на экран
@echo OFF
REM вызов функции
call :GetSum %1 %2 -30
REM вывод результатов на экран
echo (%1   %2 - 30) = %RESULT%
REM остановка в ходе выполнения сценария
pause
REM окончание основной программы, выход из сценария
exit
REM функция суммирования
:GetSum
   if %1 == 0 (
       set /a RESULT=%2 %3
       exit /b
   )
set /a RESULT=%1 %2 %3
exit /b

Встречаются случаи, когда сценарию нужно передать параметры, описанные в конфигурационном файле. Например, мы имеем файл следующего формата:

# Файл с настройками
# Первое число
Value1=23
# Второе число
	Value2=15

Чтобы его прочитать, воспользуемся следующим сценарием:

@echo OFF
REM Вызов функции считывания текстового файла config.txt
call :read_config "%~dp0config.txt" || exit /b 1
REM Вывод считанных параметров на экран
echo Build mode  : %Value1%
echo Compiler    : %Value2%
REM окончание основной программы, выход из сценария
exit /b 0
REM функция считывания текстового файла
:read_settings
set ConfigFile=%1
REM Проверка существования файла
if not exist %ConfigFile% (
   echo FAIL: Файл с настройками отсутствует
   exit /b 1
)
REM Обработка файла
REM   eol=# - указывает, что строку надо пропустить - это комментарий
REM   delims== - указывает разделитель - это символ "="
REM   tokens= - указывает как распределить разделенные переменные
for /f "eol=# delims== tokens=1,2" %%i in (%ConfigFile%) do (
   set %%i=%%j
)
exit /b 0

Конвейеры – это операторы, которые позволяют командам работать совместно. Обратите внимание на строку вызова функции в предыдущем примере – в ней присутствует конвейер “||”. Давайте рассмотрим, какие же конвейеры могут использоваться в bat-файлах:

  • < – ввод в первую команду результатов выполнения второй программы;
  • | – передача выхода первой команды непосредственно на вход другой;
  • || – выполнение второй команды только в том случае, если первая дала сбой;
  • & – выполнение второй команды после выполнения первой;
  • && – выполнение второй команды только в том случае, если первая выполнена успешно.

Данный пример осуществляет поиск каталога или файла, в название которого входит слово “Accessories”.

dir "C:Program Files" /S | find "Accessories"

Конвейер команд состоит из двух частей: первая команда выводит все файлы и каталоги папки “C:Program Files” (дополнительный параметр “/S” означает, что нужно обработать и подпапки), вторая команда получает результат выполнения первой через оператор конвейера “|” и осуществляет поиск слов “Accessories”.

На этом я закончу разбор операторов командной строки и приведу несколько сценариев bat-файлов из моей практики.

Данный сценарий разработан для установки программы Autodesk DWG True View. Установочный пакет и скрипт размещаются на сервере. Чтобы установить программу на компьютер пользователя, нужно подключить сетевой ресурс на требуемом компьютере и запустить bat-файл.

REM отключение вывода команд на экран
@ECHO OFF
REM задание заголовка окна оболочки
TITLE Autodesk DWG True View
REM запуск установочного файла в режиме пассивной установки
"%~DP0DWGViewer.msi" /passive
REM копирование чертежа на рабочий стол пользователей
COPY "%~DP0Draw.dwg" "%ALLUSERSPROFILE%Desktop"

Здесь используются такие параметры как:

Данный сценарий разработан для распаковки всех архивов, находящихся в одной папке, в указанную директорию. Приложение-распаковщик, папка с архивами и папка для распакованных файлов находятся в той же директории, что и сценарий. Чтобы установить распаковать архивы, нужно запустить bat-файл.

REM отключение вывода команд на экран
@ECHO OFF
REM проверка, что папка для распаковки существует, удаление папки
IF EXIST "%~DP0Extracts" RD "%~DP0Extracts" /S /Q
REM создание папки для распаковки
MD "%~DP0Extracts"
REM распаковка всех 7z-файлов из папки Archives в папку Extracts
FOR %%a IN ("%~DP0Archives*.7z") DO CALL "%~DP07z.exe" e "%%a" -o"%~DP0Extracts" -r

Здесь используются такие процедуры как:

  • IF EXISTfolder- поверка существования папки или файла;
  • %~DP0 – подстановка пути месторасположения сценария;
  • RDfolder/S /Q – удаление каталога без вывода на экран подтверждения на удаление
  • FOR %%a IN (foldermask) DO – цикл перебора всех элементов в выбранном списке;
  • CALLapplication”%%a” – вызов внешнего приложения и передача ему параметра из цикла.

Данный сценарий разработан для создания загрузочного диска с помощью пакета Microsoft Windows Automated Installation Kit. Запускается из командной строки указанного выше пакета. Результатом работы сценария является загрузочный ISO-образ, который впоследствии можно записать на DVD и использовать для установки или восстановления системы. Более подробно о создании такого диска будет рассказано в одной из следующих статей.

REM копирование заготовки загрузочного диска
copype.cmd x86 c:DeploymentDiskwinpe_x86
REM монтирование заготовки для изменения
imagex /mountrw c:DeploymentDiskwinpe_x86winpe.wim 1 c:DeploymentDisk^
 winpe_x86mount
REM внедрение в заготовку необходимых пакетов
peimg /install=WinPE-Scripting-Package c:eploymentDiskwinpe_x86mount^
 Windows
peimg /install=WinPE-HTA-Package c:DeploymentDiskwinpe_x86mountWindows
peimg /install=WinPE-WMI-Package c:DeploymentDiskwinpe_x86mountWindows
peimg /install=WinPE-XML-Package c:DeploymentDiskwinpe_x86mountWindows
REM вывод на экран установленых в заготовку пакетов
peimg /list c:DeploymentDiskwinpe_x86mountWindows
REM внедрение в заготовку дополнительных драйверов
peimg /inf=C:DeploymentDiskwinpe_toolsDrivers*.inf c:DeploymentDisk^
 winpe_x86mountWindows
REM подготовка заготовки к записи на диск
peimg /prep /f c:DeploymentDiskwinpe_x86mountWindows
REM копирование дополнительных программ в заготовку
xcopy C:DeploymentDiskwinpe_toolsStarter c:DeploymentDiskwinpe_x86^
 mount /S /Y
xcopy C:DeploymentDiskwinpe_toolswinpe.bmp C:DeploymentDiskwinpe_x86^
 mountWindowsSystem32 /Y
xcopy C:DeploymentDiskwinpe_toolswinpeshl.ini C:DeploymentDiskwinpe_x86^
 mountWindowsSystem32 /Y
REM размонтирование заготовки
imagex /unmount /commit c:CommonDeploymentDiskwinpe_x86mount
REM копирование готового загрузчика в папку ISO-проекта
xcopy /y C:DeploymentDiskwinpe_x86winpe.wim C:DeploymentDiskwinpe_x86^
 ISOsourcesboot.wim
REM копирование дополнительных программ в ISO-проект
xcopy C:DeploymentDiskwinpe_toolsFarManager C:DeploymentDiskwinpe_x86^
 isoFarManager /S /Y
xcopy C:DeploymentDiskwinpe_toolsStarter C:DeploymentDiskwinpe_x86iso^
 Starter /S /Y
xcopy C:DeploymentDiskwinpe_toolsDeployment C:DeploymentDiskwinpe_x86iso^
 Deployment /S /Y
REM создание ISO-образа загрузочного диска
oscdimg -m -n -h -lDeployment -bC:CommonDeploymentDiskwinpe_x86etfsboot.com ^
 C:CommonDeploymentDiskwinpe_x86ISO C:CommonDeploymentDiskwinpe_x86^
 Deployment.iso

Здесь используются такие процедуры Microsoft Windows Automated Installation Kit как:

  • copype.cmd – сценарий копирования заготовки диска;
  • imagex – утилита редактирования образа операционной системы;
  • peimg – утилита подготовки образа операционной системы;
  • oscdimg – утилита создания ISO-образов;
:/>  Редактирование меню загрузки, или куда пропал boot.ini - Windows 7 - Программные продукты - Статьи

Этот сценарий разработан для разметки и форматирования диска компьютера перед установкой операционной системы. Скрипт в основном запускают в специальной прединсталляционной операционной системе Windows PE, например в такой, какая была собрана в предыдущем примере.

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

REM отключение вывода команд на экран
@ECHO OFF
REM создание новой дисковой структуры
ECHO "Creating the new disk structure"
DISKPART.EXE /S "%~DP0DiskPart00.txt">nul
REM создание файловой сиситемы
ECHO "Formating the disk"
ECHO Y | FORMAT C: /Q /FS:NTFS /V:>nul
REM вывод на экран результатов обработки диска
DISKPART.EXE /S "%~DP0DiskPart01.txt"
ECHO "The disk partitioning is completed. Please review the log in this window."
PAUSE

В этом примере используются:

  • DISKPART.EXE – утилита разметки диска, которая использует внешние сценарии (эти сценарии приведены ниже);
  • конвейер “|” – на вход команды “FORMAT” подается значение “Y”, что позволяет избежать участия пользователя в работе сценария;
  • FORMAT – команда форматирования диска, использующая ключи, которые определяют, что нужно отформатировать диск С: в формате NTFS в быстром режиме и без метки диска;
  • >nul – перенаправление результатов команд в ноль.

Сценарий разметки диска:

select disk 0
clean
create partition primary
select partition 1
active
assign letter=C

Сценарий вывода информации о диске:

select disk 0
select partition 1
detail partition

Кстати, два последних сценария являются интегрированными скриптами – они работают только внутри программы DISKPART.EXE.

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

REM отключение вывода команд на экран
@ECHO OFF
REM создание меню быстрого запуска
IF NOT EXIST "%SYSTEMDRIVE%Documents and SettingsDefault UserApplication Data^
 MicrosoftInternet ExplorerQuick Launch" MD "%systemdrive%^
 Documents and SettingsDefault UserApplication DataMicrosoft^
 Internet ExplorerQuick Launch"
REM установка классического входя в систему
REGEDIT /S "%~DP0Classic_Login.reg"
REM удаление ярлыка на центр обновления Windows
IF EXIST "C:Documents and SettingsAll UsersStart MenuWindows Update.lnk"^
 DEL "C:Documents and SettingsAll UsersStart MenuWindows Update.lnk">nul
REM остановка сервиса Windows Management Instrumentation
NET STOP "WINMGMT" /Y>nul
REM удаление репозитория сервиса Windows Management Instrumentation
DELTREE /Y "%SystemRoot%System32WBEMRepository">nul
REM запуск сервиса Windows Management Instrumentation
NET START "WINMGMT" /Y>nul
REM регистрация путей драйверов
CSCRIPT "%~DP0DevicePath.vbs"
REM перемещение утилиты robocopy.exe в системный каталог
MOVE /Y "%~DP0robocopy.exe" %SystemRoot%System32
REM добавление администраторов компании в локальные администраторы компьютера
CSCRIPT "%~DP0AddAccountToAdmins.vbs" "DOMAINSite Admins"
REM замена ссылок "по умолчанию" на ссылки сервера компании
"%~DP0REGFIND.exe" -b -y \DefaultServerDistrib$ -r \SiteServerDistrib$
"%~DP0REGFIND.exe" -b -y http://u18.eset.com:8081 -r http://SiteServer.domain.com:8081
REM установка клиента MS SMS 2003
MSIEXEC /i "%~DP0client.msi" /passive
REM подписывание клиента MS SMS 2003 к серверу компании
CSCRIPT "%~DP0AssignSMSClient.vbs"
REM очистка журнала компьютера
CSCRIPT "%~DP0ClearEventLogs.vbs"
REM удаление временной папки
RD /S /Q C:Temp
REM удаление сценариев настройки компьютера
DEL /q "%~DP0ClearEventLogs.vbs"
DEL /q "%~DP0regfind.exe"
DEL /q "%~DP0DevicePath.vbs"
DEL /q "%~DP0AddAccountToAdmins.vbs"
DEL /q "%~DP0client.msi"
DEL /q "%~DP0AssignSMSClient.vbs"
REM перезагрузка компьютера
CSCRIPT "%~DP0Reboot.vbs"

Здесь использованы такие команды и внешние модули как:

  • IF NOT EXIST folder command – проверка на существование папки;
  • REGEDIT file – слияние файла с реестром;
  • NET STOP – остановка сервиса;
  • NET START – запуск сервиса;
  • CSCRIPT – выполение VBS-сценария в консольном режиме;
  • REGFIND – утилита поиска и замены значений реестра;
  • MSIEXEC – утилита распаковки MSI-пакета.

Итак, давайте подведем итог: для чего применяются bat-сценарии, что с их помощью можно сделать, какие ограничения имеют такие сценарии:

  • сценарии не требуют компиляции и их код в любой момент можно отредактировать;
  • BAT-сценарии просты и быстры в написании;
  • BAT-файлы выполняются в консоли, поэтому пользователь видит ход выполнения сценария, и знает, когда сценарий закончит свою работу;
  • эти скрипты, в основном, применяются для копирования файлов и для запуска других приложений;
  • BAT-файлы ограничены в функциональности и не могут выполнять сложных задач;
  • такие сценарии могут выполняться только в консоли MS DOS.

Продолжение следует…

Виталий Бочкарев

Итоги

Сегодня мы рассказали о том, как приступить к написанию bash-скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема bash-программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.

  1. Bash Script Step By Step — здесь речь идёт о том, как начать создание bash-скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.
  2. Bash Scripting Part 2, Bash the awesome — тут раскрываются особенности работы с циклами for и while.
  3. Bash Scripting Part 3, Parameters & options — этот материал посвящён параметрам командной строки и ключам, которые можно передавать скриптам, работе с данными, которые вводит пользователь, и которые можно читать из файлов.
  4. Bash Scripting Part 4, Input & Output — здесь речь идёт о дескрипторах файлов и о работе с ними, о потоках ввода, вывода, ошибок, о перенаправлении вывода.
  5. Bash Scripting Part 5, Sighals & Jobs — этот материал посвящён сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.
  6. Bash Scripting Part 6, Functions — тут можно узнать о создании и использовании функций в скриптах, о разработке библиотек.
  7. Bash Scripting Part 7, Using sed — эта статья посвящена работе с потоковым текстовым редактором sed.
  8. Bash Scripting Part 8, Using awk — данный материал посвящён программированию на языке обработки данных awk.
  9. Bash Scripting Part 9, Regular Expressions — тут можно почитать об использовании регулярных выражений в bash-скриптах.
  10. Bash Scripting Part 10, Practical Examples — здесь приведены приёмы работы с сообщениями, которые можно отправлять пользователям, а так же методика мониторинга диска.
  11. Bash Scripting Part 11, Expect Command — этот материал посвящён средству Expect, с помощью которого можно автоматизировать взаимодействие с интерактивными утилитами. В частности, здесь идёт речь об expect-скриптах и об их взаимодействии с bash-скриптами и другими программами.

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

Уважаемые читатели! Просим гуру bash-программирования рассказать о том, как они добрались до вершин мастерства, поделиться секретами, а от тех, кто только что написал свой первый скрипт, ждём впечатлений.

Оставьте комментарий

Adblock
detector