Bash-скрипты: начало / Хабр
Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями
Bash-скрипты, часть 6: функции и разработка библиотек
Bash-скрипты, часть 7: sed и обработка текстов
Bash-скрипты, часть 8: язык обработки данных awk
Bash-скрипты, часть 9: регулярные выражения
Bash-скрипты, часть 10: практические примеры
Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит
Сегодня поговорим о bash-скриптах. Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, но мы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux.
Сценарии командной строки — это наборы тех же самых команд, которые можно вводить с клавиатуры, собранные в файлы и объединённые некоей общей целью.
Итак, если говорить о командной строке, она позволяет выполнить несколько команд за один раз, введя их через точку с запятой:
pwd ; whoami
На самом деле, если вы опробовали это в своём терминале, ваш первый bash-скрипт, в котором задействованы две команды, уже написан. Работает он так. Сначала команда pwd
выводит на экран сведения о текущей рабочей директории, потом команда whoami
показывает данные о пользователе, под которым вы вошли в систему.
Используя подобный подход, вы можете совмещать сколько угодно команд в одной строке, ограничение — лишь в максимальном количестве аргументов, которое можно передать программе. Определить это ограничение можно с помощью такой команды:
getconf ARG_MAX
Командная строка — отличный инструмент, но команды в неё приходится вводить каждый раз, когда в них возникает необходимость. Что если записать набор команд в файл и просто вызывать этот файл для их выполнения? Собственно говоря, тот файл, о котором мы говорим, и называется сценарием командной строки.
Как устроены bash-скрипты
Создайте пустой файл с использованием команды touch
. В его первой строке нужно указать, какую именно оболочку мы собираемся использовать. Нас интересует bash
, поэтому первая строка файла будет такой:
#!/bin/bash
В других строках этого файла символ решётки используется для обозначения комментариев, которые оболочка не обрабатывает. Однако, первая строка — это особый случай, здесь решётка, за которой следует восклицательный знак (эту последовательность называют шебанг) и путь к
, указывают системе на то, что сценарий создан именно для bash
.
Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит:
#!/bin/bash # This is a comment pwd whoami
Тут, так же, как и в командной строке, можно записывать команды в одной строке, разделяя точкой с запятой. Однако, если писать команды на разных строках, файл легче читать. В любом случае оболочка их обработает.
Установка разрешений для файла сценария
Сохраните файл, дав ему имя myscript
, и работа по созданию bash-скрипта почти закончена. Сейчас осталось лишь сделать этот файл исполняемым, иначе, попытавшись его запустить, вы столкнётесь с ошибкой Permission denied
.
Попытка запуска файла сценария с неправильно настроенными разрешениями
Сделаем файл исполняемым:
chmod +x ./myscript
Теперь попытаемся его выполнить:
./myscript
После настройки разрешений всё работает как надо.
Успешный запуск bash-скрипта
Вывод сообщений
Для вывода текста в консоль Linux применяется команда echo
. Воспользуемся знанием этого факта и отредактируем наш скрипт, добавив пояснения к данным, которые выводят уже имеющиеся в нём команды:
#!/bin/bash # our comment is here echo "The current directory is:" pwd echo "The user logged in is:" whoami
Вот что получится после запуска обновлённого скрипта.
Вывод сообщений из скрипта
Теперь мы можем выводить поясняющие надписи, используя команду echo
. Если вы не знаете, как отредактировать файл, пользуясь средствами Linux, или раньше не встречались с командой echo
, взгляните на этот материал.
Использование переменных
Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами.
Нет ничего плохого в исполнении отдельных команд без хранения результатов их работы, но возможности такого подхода весьма ограничены.
Существуют два типа переменных, которые можно использовать в bash-скриптах:
- Переменные среды
- Пользовательские переменные
Переменные среды
Иногда в командах оболочки нужно работать с некими системными данными. Вот, например, как вывести домашнюю директорию текущего пользователя:
#!/bin/bash # display user home echo "Home for the current user is: $HOME"
Обратите внимание на то, что мы можем использовать системную переменную $HOME
в двойных кавычках, это не помешает системе её распознать. Вот что получится, если выполнить вышеприведённый сценарий.
Использование переменной среды в сценарии
А что если надо вывести на экран значок доллара? Попробуем так:
echo "I have $1 in my pocket"
Система обнаружит знак доллара в строке, ограниченной кавычками, и решит, что мы сослались на переменную.
$1
. Это не то, что нам нужно. Что делать?В подобной ситуации поможет использование управляющего символа, обратной косой черты, перед знаком доллара:
echo "I have \$1 in my pocket"
Теперь сценарий выведет именно то, что ожидается.
Использование управляющей последовательности для вывода знака доллара
Пользовательские переменные
В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария.
Как и в случае с системными переменными, к пользовательским переменным можно обращаться, используя знак доллара:
#!/bin/bash # testing variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade"
Вот что получится после запуска такого сценария.
Пользовательские переменные в сценарии
Подстановка команд
Одна из самых полезных возможностей bash-скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария.
Сделать это можно двумя способами.
- С помощью значка обратного апострофа «`»
- С помощью конструкции
$()
Используя первый подход, проследите за тем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка:
mydir=`pwd`
При втором подходе то же самое записывают так:
mydir=$(pwd)
А скрипт, в итоге, может выглядеть так:
#!/bin/bash mydir=$(pwd) echo $mydir
В ходе его работы вывод команды pwd
будет сохранён в переменной mydir
, содержимое которой, с помощью команды echo
, попадёт в консоль.
Скрипт, сохраняющий результаты работы команды в переменной
Математические операции
Для выполнения математических операций в файле скрипта можно использовать конструкцию вида $((a+b))
:
#!/bin/bash var1=$(( 5 + 5 )) echo $var1 var2=$(( $var1 * 2 )) echo $var2
Математические операции в сценарии
Управляющая конструкция if-then
В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then
. В наиболее простом виде она выглядит так:
if команда then команды fi
А вот рабочий пример:
#!/bin/bash if pwd then echo "It works" fi
В данном случае, если выполнение команды pwd
завершится успешно, в консоль будет выведен текст «it works».
Воспользуемся имеющимися у нас знаниями и напишем более сложный сценарий. Скажем, надо найти некоего пользователя в /etc/passwd
, и если найти его удалось, сообщить о том, что он существует.
#!/bin/bash user=likegeeks if grep $user /etc/passwd then echo "The user $user Exists" fi
Вот что получается после запуска этого скрипта.
Поиск пользователя
Здесь мы воспользовались командой grep
для поиска пользователя в файле /etc/passwd
. Если команда grep
вам незнакома, её описание можно найти здесь.
В этом примере, если пользователь найден, скрипт выведет соответствующее сообщение. А если найти пользователя не удалось? В данном случае скрипт просто завершит выполнение, ничего нам не сообщив. Хотелось бы, чтобы он сказал нам и об этом, поэтому усовершенствуем код.
Управляющая конструкция if-then-else
Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией if-then-else
. Вот как она устроена:
if команда then команды else команды fi
Если первая команда возвратит ноль, что означает её успешное выполнение, условие окажется истинным и выполнение не пойдёт по ветке else
. В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else
.
Напишем такой скрипт:
#!/bin/bash user=anotherUser if grep $user /etc/passwd then echo "The user $user Exists" else echo "The user $user doesn’t exist" fi
Его исполнение пошло по ветке else
.
Запуск скрипта с конструкцией if-then-else
Ну что же, продолжаем двигаться дальше и зададимся вопросом о более сложных условиях. Что если надо проверить не одно условие, а несколько? Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, и так далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так:
if команда1 then команды elif команда2 then команды fi
Если первая команда вернёт ноль, что говорит о её успешном выполнении, выполнятся команды в первом блоке then
, иначе, если первое условие окажется ложным, и если вторая команда вернёт ноль, выполнится второй блок кода.
#!/bin/bash user=anotherUser if grep $user /etc/passwd then echo "The user $user Exists" elif ls /home then echo "The user doesn’t exist but anyway there is a directory under /home" fi
В подобном скрипте можно, например, создавать нового пользователя с помощью команды useradd
, если поиск не дал результатов, или делать ещё что-нибудь полезное.
Сравнение чисел
В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.
n1 -eq n2
Возвращает истинное значение, еслиn1
равноn2
.n1 -ge n2
Возвращает истинное значение, еслиn1
больше или равноn2
.n1 -gt n2
Возвращает истинное значение, еслиn1
большеn2
.n1 -le n2
Возвращает истинное значение, еслиn1
меньше или равноn2
.n1 -lt n2
Возвращает истинное значение, если n1 меньшеn2
.n1 -ne n2
Возвращает истинное значение, еслиn1
не равноn2
.
В качестве примера опробуем один из операторов сравнения. Обратите внимание на то, что выражение заключено в квадратные скобки.
#!/bin/bash val1=6 if [ $val1 -gt 5 ] then echo "The test value $val1 is greater than 5" else echo "The test value $val1 is not greater than 5" fi
Вот что выведет эта команда.
Сравнение чисел в скриптах
Значение переменной val1
больше чем 5, в итоге выполняется ветвь then
оператора сравнения и в консоль выводится соответствующее сообщение.
Сравнение строк
В сценариях можно сравнивать и строковые значения. Операторы сравнения выглядят довольно просто, однако у операций сравнения строк есть определённые особенности, которых мы коснёмся ниже. Вот список операторов.
str1 = str2
Проверяет строки на равенство, возвращает истину, если строки идентичны.
str1 != str2
Возвращает истину, если строки не идентичны.str1 < str2
Возвращает истину, еслиstr1
меньше, чемstr2
.str1 > str2
Возвращает истину, еслиstr1
больше, чемstr2
.-n str1
Возвращает истину, если длинаstr1
больше нуля.-z str1
Возвращает истину, если длинаstr1
равна нулю.
Вот пример сравнения строк в сценарии:
#!/bin/bash user ="likegeeks" if [$user = $USER] then echo "The user $user is the current logged in user" fi
В результате выполнения скрипта получим следующее.
Сравнение строк в скриптах
Вот одна особенность сравнения строк, о которой стоит упомянуть. А именно, операторы «>» и «<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>» как команду перенаправления вывода.
Вот как работа с этими операторами выглядит в коде:
#!/bin/bash val1=text val2="another text" if [ $val1 \> $val2 ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi
Вот результаты работы скрипта.
Сравнение строк, выведенное предупреждение
Обратите внимание на то, что скрипт, хотя и выполняется, выдаёт предупреждение:
./myscript: line 5: [: too many arguments
Для того, чтобы избавиться от этого предупреждения, заключим $val2
в двойные кавычки:
#!/bin/bash val1=text val2="another text" if [ $val1 \> "$val2" ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi
Теперь всё работает как надо.
Сравнение строк
Ещё одна особенность операторов «>» и «<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:
Likegeeks likegeeks
Сохраним его, дав имя myfile
, после чего выполним в терминале такую команду:
sort myfile
Она отсортирует строки из файла так:
likegeeks Likegeeks
Команда sort
, по умолчанию, сортирует строки по возрастанию, то есть строчная буква в нашем примере меньше прописной. Теперь подготовим скрипт, который будет сравнивать те же строки:
#!/bin/bash val1=Likegeeks val2=likegeeks if [ $val1 \> $val2 ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi
Если его запустить, окажется, что всё наоборот — строчная буква теперь больше прописной.
Команда sort и сравнение строк в файле сценария
В командах сравнения прописные буквы меньше строчных. Сравнение строк здесь выполняется путём сравнения ASCII-кодов символов, порядок сортировки, таким образом, зависит от кодов символов.
Команда sort
, в свою очередь, использует порядок сортировки, заданный в настройках системного языка.
Проверки файлов
Пожалуй, нижеприведённые команды используются в bash-скриптах чаще всего. Они позволяют проверять различные условия, касающиеся файлов. Вот список этих команд.
-d file
Проверяет, существует ли файл, и является ли он директорией.-e file
Проверяет, существует ли файл.-f file
Проверяет, существует ли файл, и является ли он файлом.-r file
Проверяет, существует ли файл, и доступен ли он для чтения.-s file П
роверяет, существует ли файл, и не является ли он пустым.-w file
Проверяет, существует ли файл, и доступен ли он для записи.-x file
Проверяет, существует ли файл, и является ли он исполняемым.file1 -nt file2
Проверяет, новее лиfile1
, чемfile2
.file1 -ot file2
Проверяет, старше лиfile1
, чемfile2
.-O file
Проверяет, существует ли файл, и является ли его владельцем текущий пользователь.-G file
Проверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя.
Эти команды, как впрочем, и многие другие рассмотренные сегодня, несложно запомнить. Их имена, являясь сокращениями от различных слов, прямо указывают на выполняемые ими проверки.
Опробуем одну из команд на практике:
#!/bin/bash mydir=/home/likegeeks if [ -d $mydir ] then echo "The $mydir directory exists" cd $ mydir ls else echo "The $mydir directory does not exist" fi
Этот скрипт, для существующей директории, выведет её содержимое.
Вывод содержимого директории
Полагаем, с остальными командами вы сможете поэкспериментировать самостоятельно, все они применяются по тому же принципу.
Итоги
Сегодня мы рассказали о том, как приступить к написанию bash-скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема bash-программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.
- Bash Script Step By Step — здесь речь идёт о том, как начать создание bash-скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.
- Bash Scripting Part 2, Bash the awesome — тут раскрываются особенности работы с циклами for и while.
- Bash Scripting Part 3, Parameters & options — этот материал посвящён параметрам командной строки и ключам, которые можно передавать скриптам, работе с данными, которые вводит пользователь, и которые можно читать из файлов.
- Bash Scripting Part 4, Input & Output — здесь речь идёт о дескрипторах файлов и о работе с ними, о потоках ввода, вывода, ошибок, о перенаправлении вывода.
- Bash Scripting Part 5, Sighals & Jobs — этот материал посвящён сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.
- Bash Scripting Part 6, Functions — тут можно узнать о создании и использовании функций в скриптах, о разработке библиотек.
- Bash Scripting Part 7, Using sed — эта статья посвящена работе с потоковым текстовым редактором sed.
- Bash Scripting Part 8, Using awk — данный материал посвящён программированию на языке обработки данных awk.
- Bash Scripting Part 9, Regular Expressions — тут можно почитать об использовании регулярных выражений в bash-скриптах.
- Bash Scripting Part 10, Practical Examples — здесь приведены приёмы работы с сообщениями, которые можно отправлять пользователям, а так же методика мониторинга диска.
- Bash Scripting Part 11, Expect Command — этот материал посвящён средству Expect, с помощью которого можно автоматизировать взаимодействие с интерактивными утилитами. В частности, здесь идёт речь об expect-скриптах и об их взаимодействии с bash-скриптами и другими программами.
Полагаем, одно из ценных свойств этой серии статей заключается в том, что она, начинаясь с самого простого, подходящего для пользователей любого уровня, постепенно ведёт к довольно серьёзным темам, давая шанс всем желающим продвинуться в деле создания сценариев командной строки Linux.
Уважаемые читатели! Просим гуру bash-программирования рассказать о том, как они добрались до вершин мастерства, поделиться секретами, а от тех, кто только что написал свой первый скрипт, ждём впечатлений.
7 скриптов для Windows, которые помогут сэкономить время | GeekBrains
Основы скриптов на PowerShell.
3 минуты
104256
Автор статьи
Илья Бубнов
Автор статьи
Илья Бубнов
https://gbcdn. mrgcdn.ru/uploads/post/998/og_cover_image/136640dcd4ae5c224e8596715579ad95
Если вы только недавно встали на путь программирования и ещё даже не пробовали поиграться с установленной операционной системой, то манипулирование с помощью скриптов может вызвать резонные вопросы необходимости и удобства. Однако, даже если опустить тот простой факт, что они помогают лучше понять, как функционирует ОС, в будущем при создании приложений, исполнение сценариев может оказаться крайне полезным навыком.
Для исполнения следующих скриптов мы обратимся к PowerShell. Любой системный администратор (по профессии или в душе) знает его возможности и периодически пользуется, для всех остальных это просто интерфейс командной строки или иностранное слово. На популярных ресурсах вы можете найти уйму идей, как использовать PowerShell для развлечения и дела, здесь же мы рассмотрим лишь простые скрипты, которые помогут войти в курс дела.
Выключение и перезапуск
Итак, самая простая операция выключения вашего компьютера. Открываем блокнот, прописываем:
shutdown -s -t 0
Сохраняем файл, как *.cmd (*- имя вашего файла, например shutdown.cmd) и не забудьте в типе выбрать “все файлы”. Всё, исполняемый файл по запуску выключит ваш компьютер. “-s”, в данном случае означает выключение, замените на “-r” — получите перезагрузку. “-t” — таймер, у нас он установлен на 0 секунд, но если установить на 60 — получите выключение через 60 секунд.
Удаляем ненужное
В различных сборках, предустановленных на компьютер или ноутбук, вы можете наткнуться на массу абсолютно ненужных пакетов приложений. Удалить их с помощью скрипта проще простого:
get-appxpackage -name *APPNAME* | remove-appxpackage
Как вы понимаете, *APPNAME* — название неинтересующей надстройки. Да, удалять эти пакеты можно стандартным путём или через специальные программы, но вы можете создать скрипт, который удалит их все одним двойным кликом.
Управляем процессами
Есть в PowerShell две полезные команды, которые позволят бороться с ветряными мельницами (процессами, снижающими быстродействие). Вывести их на экран можно просто прописав:
Get-Service
или информацию о конкретном сервисе под кодовым названием *NAME* (на этом месте должно быть название интересующего сервиса):
Get-Service *NAME*
Но это можно сделать в диспетчере задач, а вот действительно полезным может оказаться создание файла, который по клику закрывал бы все процессы с повышенным потреблением ресурсов (браузеры, антивирусы и пр.). Для этого воспользуйтесь командой Stop-Service:
Stop-Service -Name *ANTIVIRUS*
Stop-Service -Name *BROWSER*
Названия для замены указаны в * *.
Переименовываем группу файлов
Ещё одна назойливая проблема: вы скопировали с фотоаппарата или телефона изображения. Огромная куча фотографий, которые называются однотипно вроде HGNMD034, где HGNMD — название общей директории, объединяющей файлы, например, отснятые за один день. Для того, чтобы сделать название этих файлов приятнее или иметь возможность объединить несколько папок, не получив при этом хронологическую путаницу из-за имен, можно использовать скрипт группового переименования:
$path = «$comp\desktop\journey\russia»
$filter = ‘*. jpg’
get-childitem -path $path -filter $filter |
rename-item -newname {$_.name -replace ‘HGNMD’,’RUSSIA’}
В первой строке в кавычках укажите точный путь к файлам. Во второй строке — расширение файлов, подлежащих изменению. В последней строке вместо “HGNMD” — общее в названиях файлов, подлежащее замене, на что-то, вместо “RUSSIA” — имя, которое вы хотите присвоить. Если данный скрипт опять сохранить в качестве исполняемого файла, то подобные однотипные операции будут отнимать у вас всего несколько секунд времени.
Ищем файлы
Ещё одна простая задача, реализуемая на PowerShell — поиск файлов в директории. В данном случае рассмотрим поиск log-файлов:
Get-Childitem C:\Windows\*.log
Или чуть более сложный пример, когда поиск будет производиться ещё и в подпапках:
Get-ChildItem C:\Windows\* -Include *.log -Recurse -Force
Это чуть более правильная и полная запись, где “Include” — указывает на искомую часть, “Recurse” — на поиск во вложенных каталогах, “Force” — поиск включает в себя системные и скрытые файлы.
Справка
Итак, с общими принципами функционирования PowerShell мы более-менее разобрались. Если что-то непонятно — обратитесь к справочной информации следующим образом:
Get-Help Services
Это команда, которая выведет на экран все доступные команды с кратким описанием. Хотите подробнее? Нет ничего проще:
Get-Help -Name *CMDLET*
Где вместо *CMDLET* вставьте любую интересующую команду.
Находим данные
Теперь перейдём к простым скриптам, описанным чуть более сложными командами. Например, с помощью PowerShell вы можете выудить почти всю информацию о железе и комплектующих. Как вариант, вот скрипт для оценки уровня заряда аккумулятора:
Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.PowerStatus].GetConstructor(‘NonPublic, Instance’, $null, [Type[]]@(), $null ).Invoke($null)
Архитектура процессора удалённого компьютера:
[PSObject].Assembly.GetType( ‘System.Management.Automation.PsUtils’
). GetMethod(‘GetProcessorArchitecture’, [Reflection.BindingFlags]40
).Invoke($null, @())
Иногда важной задачей бывает проверка прав администратора у текущего пользователя. Вот простой способ на PowerShell:
[PSObject].Assembly.GetType(‘System.Management.Automation.Utils’).GetMethod(
‘IsAdministrator’, [Reflection.BindingFlags]40).Invoke($null, @())
На этом пока остановимся. Как вы наверное убедились, PowerShell не самый сложный, но очень полезный инструмент, который способен выполнять, как простейшие операции, так и достаточно сложные. Однако PowerShell не единственный инструмент для создания скриптов для Windows. Но об этом в следующий раз.
Начало карьеры: интенсив «Основы веб-разработки».
web, скрипт, powershell, windows, разработкаНашли ошибку в тексте? Напишите нам.
Упаковка скриптов Python—ArcMap | Документация
- Как обнаружить проектные данные в своем скрипте
- Импорт других модулей Python
- Код проверки инструмента
- Библиотеки сторонних производителей
- Знакомство с Python, ArcPy и инструментами-скриптами
Более подробно:
Большинство инструментов-скриптов Python, которые успешно выполняются на компьютере, будут успешно паковаться и выполняться в распакованном виде на другом компьютере, поэтому нет необходимости менять скрипты каким-либо образом. Однако если проблемы возникают, это может быть связано с использованием скриптом большого объема данных проекции или использования инструкций import для импорта разработанных пользователем модулей Python. В этом случае данный раздел может оказаться полезным, так как в нем уделяется внимание перечисленным ниже аспектам.
- Как обнаружить данные проекции, используемые в скрипте, и включить их в свой пакет.
- Как обнаружить импортированные модули и включить их в свой пакет.
- Как пакуется код проверки инструмента.
- Как пакуются сторонние библиотеки.
Если вы не знакомы с Python, ArcPy или инструментами-скриптами, обратитесь к разделк Введение в Python, ArcPy и инструменты-скрипты, в котором содержится список полезных ссылок.
Как обнаружить проектные данные в своем скрипте
При предоставлении общего доступа к результату в виде пакета или службы и ссылки этого результата на скрипт-инструмент, последний сканируется для определения каких-либо проектных данных, использованных в этом скрипте. При обнаружении проектных данных они консолидируются во временной папке, которая или упаковывается (если необходимо предоставить общий доступ к пакету), или загружается на сервер (если предоставляется общий доступ к сервису).
При сканировании скрипта каждая строка в кавычках (одинарных или двойных), использованная в переменной Python или в качестве аргумента функции, проверяется на надлежащее указание в ней пути к данным. В этом случае под данными принимается
- Слой в таблице содержания (ArcMap или ArcGlobe)
- Папка
- Файл
- Набор геоданных, например класс пространственных объектов, шейп-файл, база геоданных, документ карты (.mxd) и файл слоев (.lyr)
В рамках настоящего обсуждения внимание уделяется только данным, которые используются в качестве входных для инструментов геообработки или путей, ссылающихся на другие модули Python. Выходные данные также консолидируются, однако они не считаются проектными данными.
При обнаружении в сценарии строки в кавычках проверка на существование данных проходит следующим образом:
- Ссылается ли строка на слой в таблице содержания?
- Содержит ли строка абсолютный путь к данным (например, «e:\Warehousing\ToolData\SanFrancisco. gdb\streets»)?
- Ссылается ли строка на данные, которые размещены относительно самого скрипта? Местоположение скрипта определяется следующим образом:
- Папка, содержащая скрипт.
- Если скрипт встроен в набор инструментов, местоположением является папка, содержащаяся в наборе инструментов.
- Если скрипт содержится в наборе инструментов Python, местоположением является папка, которая содержит набор инструментов Python.
Эти проверки выполняются последовательно. Если проверка выполняется успешно и данные существуют, они будут консолидированы с учетом одного исключения: если предоставляется общий доступ к сервису, проверяется наличие данных в хранилище данных сервера. Если данные содержатся в хранилище данных, они не консолидируются.
Примечание:
Если консолидируются папки, копируются только файлы и наборы геоданных, содержащиеся в папке; подпапки не копируются. Некоторые наборы геоданных, например файловые базы геоданных, растры и TIN, формально считаются папками, однако они также являются наборами геоданных, поэтому будут копироваться. Если папка содержит файлы слоев (.lyr) или документы карты (.mxd), все данные, на которые ссылаются файл слоев или документ карты, также консолидируются, так что любые процедуры arcpy.mapping в скрипте могут получить доступ к данным, на которые имелись ссылки.
Подсказка:
Вследствие способа консолидации папок необходимо избегать размещения в папке больших наборов данных и файлов, которые никогда не будут использоваться инструментом; необходимо увеличить размер данных, упаковываемых или загружаемых на сервер. (Это не применяется к папкам, которые содержатся в хранилище данных сервера, так как эти папки не загружаются на сервер.)
Примеры
Приведенные ниже примеры основаны на этой структуре папок:
Папка примера проекта
Установка относительных путей к данным
Следующий способ поиска данных относительно местоположения сценария является обычным шаблоном, особенно применимым к сервисам, созданным в ArcGIS 10.0. Папка ToolData содержит SanFrancisco. gdb. В SanFrancisco.gdb содержится класс пространственных объектов Streets. В приведенном ниже примере кода путь к папке ToolData и находящихся в ней наборам данных формируется относительно местоположения скрипта (та же папка, что и для Warehouse.tbx).
import arcpy import os import sys # Get the directory the script lives in. # Folders and data will be found relative to this location. # scriptPath = sys.path[0] # Construct paths to ../ToolData/SanFrancisco.gdb/Streets and # ../ToolData/Warehouse.lyr streetFeatures = os.path.join(scriptPath, "ToolData\\SanFrancisco.gdb\\Streets") streetLyr = os.path.join(scriptPath, "ToolData\\Warehouse.lyr")
В приведенном выше коде, переменные streetFeatures и streetLyr будут проверяться на предмет наличия упоминаемых в них данных. Эта наборы данных будут собраны и загружены на сервер (если только папка, в которой они находятся, не была зарегистрирована как часть хранилища данных сервера).
Относительные пути к папкам
На саму папку ToolData также можно ссылаться и использовать как начальную точку для ссылок на элементы. В приведенном ниже примере кода путь к папке ToolData формируется относительно местоположения скрипта (та же папка, что и для Warehouse.tbx).
import arcpy import os import sys # Get the directory the script lives in. # Folders and data will be found relative to this location. # scriptPath = sys.path[0] # Construct paths to the ToolData folder toolDataFolder = os.path.join(scriptPath, "ToolData") # Construct path to items inside the folder streetFeatures = os.path.join(toolDataFolder, "SanFrancisco.gdb\\Streets")
В приведенном выше коде, переменная toolDataFolder становится относительным путем к папке с различными элементами, на которые может ссылаться скрипт Python. Эта папка ToolData будет консолидирована – все ее содержимое (за исключением подпапок, как уже говорилось выше) будет упаковано или загружено на сервер (если только папка ToolData не является частью хранилища данных сервера).
Обратите внимание, что при ссылке на папку, копируется все содержимое папки, а не отдельные файлы. Например, в приведенном выше коде, несмотря на то, что однозначного пути к файлу Warehouse.lyr нет, этот файл будет консолидирован, поскольку присутствует в указанной папке.
Абсолютный путь к набору геоданных
Абсолютный путь начинается с буквы диска, например e:/, как показано ниже на примере кода.
import arcpy import os streetFeatures = 'e:/Warehousing/ToolData/SanFrancisco.gdb/Streets'
В вышеприведенном коде консолидируется набор данных Streets и все прочие данные, от которых зависит этот набор (например, классы отношений и домены).
Гибридный пример
import arcpy import os toolDataPath = r'e:\Warehousing\ToolData' warehouseLyr = os.path.join(toolDataPath, "Warehouse.lyr")
В приведенном выше коде консолидируется все содержимое папки ToolData. Так как консолидируется содержимое папки (за исключением подпапок), Warehouse.lyr консолидируется вместе с другими данными, на которые ссылается Warehouse.lyr.
Ссылки на слои, как данные проекта
Не совсем обычный способ использования слоев в качестве данных проекта, может привести к значительному увеличению производительности в инструментах-скриптах Python. В вышеуказанных сниппетах Python используются полные пути к классам объектов и файлам слоя. При выполнении сервиса геообработки, он должен сначала открыть набор данных, что требует максимальной производительности. Использование слоев в скриптах позволяет держать данные открытыми и кэшированными, что повышает быстродействие. На следующем рисунке показано, как подбираются и используются в скрипте Python слои из Таблицы содержания ArcMap.
Слои, также использующиеся в инструменте-скрипте Python
Два слоя из Таблицы содержания используются в инструменте-скрипте. Переменные указывают на простые строки, которые совпадают с именами слоев в документе карты. При публикации этого рабочего процесса на ArcGIS Server данные будут собраны и перемещены на сервер (если они не присутствуют в хранилище данных), а сервис будет хранить ссылки на слои в памяти. Внутри сервиса инструмент будет находить и использовать слои через сопоставление имен.
Примечание:
При использовании слоев в инструменте-скрипте как внутренних данных проекта, скрипт становится зависимым от связанного документа карты. Вы не можете запускать инструмент в ArcCatalog или из другого документа карты, не содержащего этих слоев. Это правило не работает с Обработкой в фоновом режиме и снижает общую портативность рабочего процесса. По этой причине этот метод больше подходит для создания сервисов геообработки.
Прямые и обратные косые черты
В Windows обратная косая черта (\) используется в качестве разделителя при указании пути. UNIX-системы используют прямую косую черту (/).
Примечание:
В ArcGIS не имеет значения, какая косая черта используется при указании пути. ArcGIS всегда будет правильно считывать путь, какой бы знак в нем не использовался.
Обратная косая черта при написании скрипта
Языки программирования берут свое начало в UNIX, а язык С, как и Python, рассматривает обратную косую черту (\) как знак перехода. Например, \t означает табуляцию. Поскольку пути могут содержать обратные косые черты, необходимо избегать их распознавания как знака перехода. Проще всего конвертировать пути в не форматированные строки Python с помощью директивы указателя r, как показано ниже. Благодаря этому Python будет игнорировать обратные косые черты.
thePath = r"E:\data\telluride\newdata.gdb\slopes"
Дополнительные сведения об определении путей
Импорт других модулей Python
Пользовательский скрипт может импортировать другие разработанные скрипты. Например, в приведенном ниже коде показан импорт модуля Python с именем myutils.py, который находится в той же папке, что и родительский скрипт, и содержит процедуру getFIDName.
import arcpy import myutils inFeatures = arcpy.GetParameterAsText(0) inFID = myutils.getFIDName(inFeatures)
При появлении инструкции import, местоположение скрипта определяется в следующем порядке:
- Та же папка, содержащая скрипт. Если скрипт встроен в набор инструментов, используется папка, содержащаяся в наборе инструментов.
- Папка, которая указана в системной переменной PYTHONPATH.
- Любая папка, на которую ссылается системная переменная PATH.
Другим способом ссылки на модули, которые следует импортировать, является использование метода sys.path.append. Это позволяет задать путь к папке, содержащей скрипты, которые следует импортировать.
import arcpy import sys import os # Append the path to the utility modules to the system path # for the duration of this script. # myPythonModules = r'e:\Warehousing\Scripts' sys.path.append(myPythonModules) import myutils # a Python file within myPythonModules
В приведенном выше коде следует обратить внимание, что метод sys.path.append нуждается в папке в качестве аргумента. Так как r’e:\Warehousing\Scripts’ является папкой, будет консолидировано все содержимое папки. Правила копирования содержимого папки применяются и здесь: все содержимое папки копируется, кроме подпапок, которые не являются наборами геоданных.
Примечание:
Скрипты Python внутри папки не сканируются на наличие проектных данных или импортированных модулей.
Код проверки инструмента
Если у вас есть опыт в написании инструментов-скриптов, вы можете использовать собственную логику проверки инструмента. Логика проверки реализована в Python, поэтому код проверки будет отсканирован на наличие данных проекции и модулей, как и любой другой скрипт Python. Например, логика проверки может открыть папку (например, d:\approved_projections), содержащую файлы проекции (.prj) для создания списка выбора пространственных привязок, которые может выбрать клиент при выполнении этого инструмента. Эта папка не является параметром инструмента; она представляет собой данные проекции, используемые в рамках сценария проверки. Здесь применяются те же правила, приведенные выше для скриптов Python, следствием чего становится консолидация папки d:\approved_projections и копирования ее на сервер (если она не была найдена в хранилище данных сервера).
Библиотеки сторонних производителей
Модули сторонних производителей (любой модуль, не являющийся частью установочного пакета Python) не консолидируются. Необходимо убедиться, что модуль установлен на компьютере, где распаковывается пакет. Необходимо предоставить документацию инструмента и пакет, указывающий, какие сторонние модули необходимы. Это не относится к модулям numpy или matplotlib, устанавливаемым вместе с ArcGIS Desktop.
Знакомство с Python, ArcPy и инструментами-скриптами
Если вы не знакомы с Python, ArcPy и инструментами-скриптами, ниже приведены ссылки, которые помогут вам ознакомиться с этими темами.
Раздел справки | Содержание |
---|---|
Краткий обзор процесса создания пользовательских инструментов | Основные принципы создания собственных инструментов геообработки. |
Что такое язык Python? Что такое язык ArcPy? | Вводные статьи о языках Python и ArcPy. После знакомства с ними можно переходить к более подробным сведениям о Python и ArcPy. |
Краткий обзор создания инструментов в Python Что такое инструмент-скрипт? | Вводная статья о создании пользовательских инструментов-скриптов с помощью Python. |
Установка параметров инструмента-скрипта | После того как вы ознакомились с процессом создания инструмента-скрипта, можно переходить к подробному описанию установки его параметров. |
Связанные разделы
о скриптах — PowerShell | Microsoft Learn
- Статья
- 10 минут на чтение
Краткое описание
Описывает, как запускать и писать сценарии в PowerShell.
Подробное описание
Сценарий — это обычный текстовый файл, содержащий одну или несколько команд PowerShell.
Скрипты PowerShell имеют .ps1
расширение файла.
Запуск сценария очень похож на запуск командлета. Вы вводите путь и файл имя сценария и использовать параметры для отправки данных и установки параметров. Вы можете запускать сценарии на своем компьютере или в удаленном сеансе на другом компьютере.
При написании сценария команда сохраняется для последующего использования и упрощается совместное использование другие. Самое главное, он позволяет вам запускать команды, просто набрав путь сценария и имя файла. Скрипты могут быть такими же простыми, как одна команда в файл или столь обширный, как сложная программа.
Скрипты имеют дополнительные функции, такие как специальный комментарий #Requires
,
использование параметров, поддержка разделов данных и цифровая подпись для обеспечения безопасности. Вы также можете создавать разделы справки для сценариев и для любых функций в сценарии.
Как запустить сценарий
Прежде чем запускать сценарий в Windows, необходимо изменить Политика выполнения PowerShell. Политика выполнения не применяется к PowerShell работает на платформах, отличных от Windows.
Политика выполнения по умолчанию, Restricted
, запрещает запуск всех скриптов,
включая сценарии, которые вы пишете на локальном компьютере. Чтобы получить больше информации,
см. about_Execution_Policies.
Политика выполнения сохраняется в реестре, поэтому менять нужно только ее один раз на каждом компьютере.
Чтобы изменить политику выполнения, используйте следующую процедуру.
В командной строке введите:
Set-ExecutionPolicy AllSigned
или
Set-ExecutionPolicy RemoteSigned
Изменение вступает в силу немедленно.
Чтобы запустить сценарий, введите полное имя и полный путь к файлу сценария.
Например, чтобы запустить сценарий Get-ServiceLog.ps1 в каталоге C:\Scripts, тип:
C:\Scripts\Get-ServiceLog.ps1
Чтобы запустить скрипт в текущем каталоге, введите путь к текущему
каталог или используйте точку для представления текущего каталога, за которым следует путь
обратная косая черта ( .\
).
Например, чтобы запустить сценарий ServicesLog.ps1 в локальном каталоге, введите:
.\Get-ServiceLog.ps1
Если сценарий имеет параметры, введите параметры и значения параметров после имя файла скрипта.
Например, следующая команда использует параметр ServiceName Сценарий Get-ServiceLog для запроса журнала активности службы WinRM.
.\Get-ServiceLog.ps1 -ServiceName WinRM
В целях безопасности PowerShell не запускает сценарии при двойном щелчке значок сценария в проводнике или при вводе имени сценария без полный путь, даже если скрипт находится в текущем каталоге. Для большего информацию о выполнении команд и сценариев в PowerShell см. about_Command_Precedence.
Запуск с помощью PowerShell
Начиная с PowerShell 3.0, вы можете запускать сценарии из Проводника.
Чтобы использовать функцию «Запустить с PowerShell»:
Запустите проводник, щелкните правой кнопкой мыши имя файла сценария и выберите «Запустить с PowerShell».
Функция «Запуск с PowerShell» предназначена для запуска сценариев, не имеющих необходимые параметры и не возвращать вывод в командную строку.
Дополнительные сведения см. в разделе about_Run_With_PowerShell.
Запуск скриптов на других компьютерах
Чтобы запустить скрипт на одном или нескольких удаленных компьютерах, используйте параметр FilePath командлет Invoke-Command
.
Введите путь и имя файла сценария в качестве значения FilePath параметр. Сценарий должен находиться на локальном компьютере или в каталоге, локальный компьютер может получить доступ.
Следующая команда запускает сценарий Get-ServiceLog. ps1
на удаленном
компьютеры с именами Server01 и Server02.
Invoke-Command -ComputerName Server01,Server02 -FilePath ` C:\Scripts\Get-ServiceLog.ps1
Получение справки для сценариев
Командлет Get-Help получает разделы справки для сценариев, а также для командлетов
и другие типы команд. Чтобы получить раздел справки для скрипта, введите Get-Help
, за которым следует путь и имя файла сценария. Если сценарий
path находится в вашей переменной среды Path
, вы можете опустить путь.
Например, чтобы получить справку по сценарию ServicesLog.ps1, введите:
получить помощь C:\admin\scripts\ServicesLog.ps1
Как написать сценарий
Сценарий может содержать любые допустимые команды PowerShell, включая отдельные команды, команды, использующие конвейер, функции и структуры управления, такие как If операторы и циклы For.
Чтобы написать сценарий, откройте новый файл в текстовом редакторе, введите команды и
сохраните их в файле с допустимым именем файла с расширением . ps1
.
Следующий пример представляет собой простой сценарий, который получает службы, работающие в текущей системе, и сохраняет их в файл журнала. Имя файла журнала создан с текущей даты.
$date = (get-date).dayofyear получить-сервис | выходной файл "$date.log"
Чтобы создать этот скрипт, откройте текстовый редактор или редактор скриптов, введите эти
команды, а затем сохраните их в файле с именем ServiceLog.ps1
.
Параметры в сценариях
Чтобы определить параметры в сценарии, используйте оператор Param. Оператор Param
должен быть первым оператором в скрипте, за исключением комментариев и любых # Требуются операторы
.
Параметры скрипта работают как параметры функции. Значения параметров доступны для всех команд в сценарии. Все особенности параметры функции, включая атрибут Parameter и его именованный аргументы также допустимы в сценариях.
При запуске скрипта пользователи скрипта вводят параметры после скрипта имя.
В следующем примере показан сценарий Test-Remote.ps1
с Имя_компьютера Параметр . Обе функции сценария могут получить доступ к Имя_компьютера Значение параметра .
param ($ComputerName = $(throw "Требуется параметр ComputerName.")) функция CanPing { $ошибка.очистить() $tmp = тестовое соединение $computername -erroraction SilentlyContinue если (!$?) {write-host "Ошибка проверки связи: $ComputerName."; вернуть $ложь} еще {write-host "Пинг успешно выполнен: $ComputerName"; вернуть $true} } функция CanRemote { $s = new-pssession $computername -erroraction SilentlyContinue if ($s -is [System.Management.Automation.Runspaces.PSSession]) {write-host "Удаленная проверка прошла успешно: $ComputerName."} еще {write-host "Удаленная проверка не удалась: $ComputerName."} } if (CanPing $computername) {CanRemote $computername}
Чтобы запустить этот сценарий, введите имя параметра после имени сценария. Например:
C:\PS> .\test-remote.ps1 -имя_компьютера Server01 Пинг успешно выполнен: Server01 Ошибка удаленного тестирования: Server01
Дополнительные сведения об операторе Param и параметрах функции см. about_Functions и about_Functions_Advanced_Parameters.
Написание справки для сценариев
Вы можете написать раздел справки для сценария, используя любой из двух следующих способов: методы:
Справка по сценариям на основе комментариев
Создайте раздел справки, используя специальные ключевые слова в комментариях. Создавать Справка по скрипту на основе комментариев, комментарии должны располагаться в начале или конец файла сценария. Дополнительные сведения о справке на основе комментариев см. about_Comment_Based_Help.
Справка по сценариям на основе XML
Создайте раздел справки на основе XML, например тип, который обычно создается для командлетов. Справка на основе XML требуется, если вы переводите разделы справки на несколько языков.
Чтобы связать сценарий с разделом справки на основе XML, используйте .ExternalHelp Помогите комментировать ключевое слово. Дополнительные сведения о ключевом слове ExternalHelp см. about_Comment_Based_Help. Чтобы получить больше информации о справке на основе XML см. Как написать справку по командлету.
Возврат значения выхода
По умолчанию сценарии не возвращают состояние выхода после завершения сценария. Вы должны
используйте оператор exit
, чтобы вернуть код выхода из скрипта. По умолчанию
9Оператор 0021 exit возвращает 0
. Вы можете указать числовое значение, чтобы вернуть
другой статус выхода. Ненулевой код выхода обычно сигнализирует об ошибке.
В Windows любое число между [int]::MinValue
и [int]::MaxValue
является
допустимый.
В Unix только положительные числа между [byte]::MinValue
(0) и [byte]::MaxValue
(255) разрешено. Отрицательное число в диапазоне от до 1
. через -255
автоматически преобразуется в положительное число путем добавления
256. Например, -2
преобразуется в 254
.
В PowerShell инструкция exit
устанавливает значение $LASTEXITCODE
переменная. В командной оболочке Windows (cmd.exe) оператор выхода задает
значение переменной среды %ERRORLEVEL%
.
Любой аргумент, который не является числовым или находится за пределами диапазона, зависящего от платформы,
переведено в значение 0
.
Область сценария и источник точек
Каждый сценарий выполняется в своей области. Функции, переменные, псевдонимы и диски, созданные в сценарии, существуют только в области действия сценария. Ты не может получить доступ к этим элементам или их значениям в той области, в которой скрипт бежит.
Чтобы запустить сценарий в другой области, вы можете указать область, например глобальную. или Local, или вы можете указать источник сценария.
Функция поиска точек позволяет запускать сценарий в текущей области вместо в области скрипта. Когда вы запускаете сценарий с точечным источником, команды в сценарий запускается так, как если бы вы ввели их в командной строке. функции, переменные, псевдонимы и диски, которые создает скрипт, создаются в той сфере, в которой вы работаете. После запуска скрипта вы можете использовать созданные элементы и доступ к их значениям в вашем сеансе.
Чтобы указать источник сценария с точкой, введите точку (.) и пробел перед путем к сценарию.
Например:
. C:\scripts\UtilityFunctions.ps1
или
. .\UtilityFunctions.ps1
После запуска сценария UtilityFunctions.ps1
функции и переменные,
создаваемые сценарии добавляются в текущую область.
Например, сценарий UtilityFunctions.ps1
создает New-Profile
функция и $ProfileName
переменная.
# В UtilityFunctions.ps1 функция Новый-Профиль { Write-Host "Запуск функции New-Profile" $profileName = разделенный путь $profile -leaf если (тестовый путь $профиль) {ошибка записи "Профиль $profileName уже существует на этом компьютере. "} еще {новый элемент -тип файла -путь $профиль -сила} }
Если запустить сценарий UtilityFunctions.ps1
в его собственной области сценария, Функция New-Profile
и переменная $ProfileName
существуют только тогда, когда
скрипт работает. Когда сценарий завершается, функция и переменная
удалены, как показано в следующем примере.
C:\PS> .\UtilityFunctions.ps1 C:\PS> Новый профиль Термин «новый профиль» не распознается как командлет, функция, работающая программа или файл сценария. Проверьте термин и повторите попытку. В строке:1 символ:12 + новый профиль <<<< + Информация о категории: ObjectNotFound: (новый профиль: строка) [], + FullyQualifiedErrorId : CommandNotFoundException C:\PS> $имя_профиля C:\PS>
Когда вы создаете сценарий и запускаете его, сценарий создает New-Profile
функция и переменная $ProfileName
в вашем сеансе в вашей области. После
сценарий запускается, вы можете использовать функцию New-Profile
в своем сеансе, как
показано в следующем примере.
C:\PS> . .\UtilityFunctions.ps1 C:\PS> Новый профиль Каталог: C:\Users\juneb\Documents\WindowsPowerShell Режим LastWriteTime Длина Имя ---- ------------- ------ ---- -a--- 14.01.2009 15:08 0 Microsoft.PowerShellISE_profile.ps1 C:\PS> $имя_профиля Microsoft.PowerShellISE_profile.ps1
Дополнительные сведения об области см. в разделе about_Scopes.
Скрипты в модулях
Модуль — это набор связанных ресурсов PowerShell, которые можно распространять как Ед. изм. Вы можете использовать модули для организации ваших скриптов, функций и прочего. Ресурсы. Вы также можете использовать модули для распространения своего кода среди других и для получить код из надежных источников.
Вы можете включать сценарии в свои модули или создавать модуль сценариев, который представляет собой модуль, который полностью или в основном состоит из скрипта и вспомогательные ресурсы. Модуль сценария — это просто сценарий с файлом .psm1. расширение.
Дополнительные сведения о модулях см. в разделе about_Modules.
Другие функции сценариев
PowerShell имеет множество полезных функций, которые можно использовать в сценариях.
#Requires
. Вы можете использовать оператор#Requires
, чтобы предотвратить запуск скрипта. работает без указанных модулей или оснасток и с указанной версией PowerShell. Дополнительные сведения см. в разделе about_Requires.$PSCommandPath
— содержит полный путь и имя сценария, выполняется. Этот параметр действителен во всех сценариях. Эта автоматическая переменная представлен в PowerShell 3.0.$PSScriptRoot
— содержит каталог, из которого запускается сценарий. В PowerShell 2.0 эта переменная действительна только в модулях сценариев (.psm1
). Начиная с PowerShell 3.0, он действителен во всех скриптах.$MyInvocation
— Автоматическая переменная$MyInvocation
содержит информацию о текущем скрипте, включая информацию о том, как он был запущен или «призванный». Вы можете использовать эту переменную и ее свойства для получения информации о скрипте во время его работы. Например,$MyInvocation
Переменная .MyCommand.Path содержит путь и имя файла сценарий.$MyInvocation
.Line содержит команду, которая запустила скрипт, включая все параметры и значения.Начиная с PowerShell 3.0,
$MyInvocation
имеет два новых свойства, которые предоставить информацию о скрипте, который вызвал или вызвал текущий сценарий. Значения этих свойств заполняются только тогда, когда инициатор или caller — это скрипт.В отличие от
$PSCommandPath
и$PSScriptRoot
автоматические переменные, которые содержать информацию о текущем скрипте, PSCommandPath и PSScriptRoot свойства переменной$MyInvocation
содержат информация о скрипте, вызвавшем текущий скрипт.Разделы данных. Вы можете использовать ключевое слово
Data
, чтобы отделить данные от логики в скрипты. Разделы данных также могут упростить локализацию. Для большего информацию см. about_Data_Sections и about_Script_Internationalization.Подписание сценария. Вы можете добавить к сценарию цифровую подпись. В зависимости от политики выполнения, вы можете использовать цифровые подписи, чтобы ограничить выполнение сценариев, которые могут включать небезопасные команды. Для получения дополнительной информации см. about_Execution_Policies и about_Подписание.
См. также
- about_Command_Precedence
- about_Comment_Based_Help
- about_Execution_Policies
- about_Functions
- about_Modules
- about_Profiles
- about_Requires
- about_Run_With_PowerShell
- about_Scopes
- about_Script_Blocks
- about_Signing
- Вызов команды
простых скриптов
простой скриптСценарии оболочки Bash
Мы уже создали файл с командами linux, а затем сделали это
исполняемый файл. Например, если мы поместим следующие команды в
файл, а затем сделать этот файл исполняемым, у нас будет отличный новый
команда, чтобы показать нам, кто вошел в нашу машину:
дата
кто
Этот файл, содержащий команды Linux, является примером очень простого сценария оболочки.
Сценарии оболочки, выполняющие более сложные операции, требуют более сложного синтаксиса. Существует несколько языков оболочки. Каждый язык имеет свой собственный синтаксис для операторов if, как работают присваивания, использование переменных и т. д. Мы будем использовать оболочку bash.
Все сценарии оболочки bash должны иметь в первой строке файла следующее:
#!/бин/баш
Обратите внимание, что в оболочках bash после первой строки все строки, начинающиеся с #
комментарии. Следовательно, следующая оболочка ничего не делает.
#!/бин/баш
# Стив Дэннелли
# Лаборатория 14
Вам нужно будет указать свое имя во всех ваших лабораторных заданиях.
эхо
Echo — очень распространенная и полезная команда. Вот пример скрипта с
несколько эхо-команд
#!/бин/баш
# эхо-примеры
echo «Это пример использования эха.»
echo -n «Текущий каталог»
эхо $PWD
Первая команда echo просто печатает содержимое строки в кавычках.
Второе эхо также печатает строку, но не добавляет символ возврата. Обратите внимание вторая строка заканчивается пробелом, поэтому вывод выглядит красиво.
Третье эхо выводит содержимое встроенной переменной, которую использует система. чтобы отслеживать ваш текущий каталог (PWD — это сокращение от «Печать рабочего каталога»).
Запуск вышеуказанных файлов сценария приведет к следующему результату:
.
Это пример использования эха.
Текущий каталог: /home/ACC.dannellys2/csci208lab
.
Переменные
Несколько переменных уже встроены в систему. Чтобы увидеть имена и значения системные переменные, введите «set» в командной строке.
Чтобы создать новую переменную, просто начните ее использовать. Декларировать не надо.
Имена ваших переменных должны начинаться с буквы или символа подчеркивания (_).
Формат bash для назначения переменных —
.
var=contents
НЕ ставьте пробелы вокруг символа =.
Этот сценарий оболочки
#!/бин/баш
# эхо-примеры
имя1=Боб
имя2=имя1
имя3=$имя1
эхо $ имя1
эхо $ имя2
эхо $имя3
создаст следующий вывод
Боб
имя1
Боб
Первое присваивание помещает строку bob в новую переменную с именем name1.
Второе присваивание создает новую переменную с именем name2 и помещает в нее строку name1.
Третье присваивание создает новую переменную с именем name3 и помещает в нее содержимое переменная с именем name1.
Каждая из эхо-команд печатает содержимое другой переменной.
Аргументы командной строки
Аргументы вашего сценария оболочки помещаются в пронумерованные переменные. 1 доллар первый аргумент командной строки. 2 доллара — второй. так далее…
$# — количество аргументов.
Например, shell3 — это простая оболочка, которую я написал, чтобы продемонстрировать, как использовать аргументы командной строки.
> кошачья скорлупа3 #!/бин/баш # демонстрация аргументов echo "Есть аргументы " $# "." echo "Первый аргумент: " $1 echo "Имя этого скрипта " $0 > shell3 привет мама Есть 2 аргумента. Первый аргумент привет Имя этого скрипта ./shell3
Если операторы
Формат оператора if —
.
если [ условие ]
затем
правда вещи
еще
фальшивые вещи
фи
«Fi» — это «if» в обратном направлении и завершает блок if.
В следующем примере используется if, чтобы убедиться, что пользователь вводит аргумент. Если пользователь не вводит никаких аргументов, сценарий печатает сообщение и завершает работу. Если пользователь вводит какие-то аргументы, то скрипт выводит их количество.
Пока сценарий не завершился из-за слишком малого количества аргументов, scripts запускает команду для подсчета количества строк в имени файла при условии. Обратите внимание, что одинарные кавычки не являются обычными одинарными кавычками. Эти странные кавычки вызывают вывод команды, а не ее содержимое строки, чтобы перейти в переменную с именем lines.
#!/бин/баш # оператор if # проверить наличие достаточного количества аргументов если [$# = 0] тогда эхо "Без аргументов" выход 1 еще echo $# "Аргументы" фи # подсчитываем количество строк линии=`кошка $1 | туалет -l` # выводим результаты echo -n "Файл с именем " эхо -n $1 эхо -n "содержит" эхо -n $строки эхо "строки".Этот скрипт выдаст такой результат:
> оболочка4 Нет аргументов > оболочка4 оболочка4 1 Аргументы Файл с именем shell4 содержит 21 строку.
Более сложные операторы if
Предположим, вы хотите написать что-то вроде оператора C++ case. Операторы case полезны, когда есть несколько возможных условий для переменной, но вы хотите выполнить только одно действие. Способ сделать это в оболочке bash — написать вложенный оператор if.Вот пример вложенного оператора if. Элиф — это сокращение от «иначе, если». Операторы Else-If используются во многих языки, но не C++. Остальное должно идти последним.
#!/бин/баш # вложенные операторы if если [ $# -eq 0 ] тогда echo "Ошибка: отсутствует имя файла" выход 1 фи если [-r $1] тогда echo -n "Первые 5 строк" эхо $1 голова -n 5 $1 Элиф [ -f $1 ] тогда эхо -n "Файл " эхо -n $1 echo "существует, но не читается сценарием. " еще эхо -n "Файл " эхо -n $1 эхо "не существует." фи
Если вы хотите сравнить две строки, используйте ==.
Если вы хотите сравнить два целых числа, используйте -eq, -ne, -lt, -gt, -ge или -le
.
Это короткие слова «равно», «не равно», «меньше», «больше», «больше или равно» и «меньше или равно».
Если вы хотите использовать составную логику, подумайте еще раз. Если вы все еще хотите использовать составную логику, вы можете сделать что-то вроде этого:
если [[ $num -eq 3 && $stringvar == "foo bar baz" ]]
Задание № 14
Еще в задании номер 9 вы выяснили, как считать выпускников CSCI и CIFS. Расширьте это, включив в него выпускников ACCT, ENTR, MGMT и MKTG.Кроме того, пользователь должен указать имя файла для обработки. Если пользователь не укажите имя файла, затем распечатайте ошибку использования и выйдите.
Например
> специальностей Использование: главное имя файла > майоры lab9. txt АККТ 23 КСКИ 2 СИФС 1 ВВОД 5 МГМТ 20 МКТГ 22Обязательно протестируйте свой скрипт с входными данными, отличными от файла lab9.txt!!!!
Задание № 15
Теперь добавьте еще одну функцию к предыдущему скрипту. Разрешить пользователю возможность просмотреть имена. Опция должна быть «-names». Если пользователь включает эту опцию затем напечатайте имена, а также количество выпускных.
Например
> специальностей2 Использование: majors2 [-names] имя файла > majors2 lab7.txt КСКИ 2 СИФС 1 АККТ 23 ВВОД 5 МГМТ 20 МКТГ 22 > majors2 - имена lab7.txt КСКИ 2 Диксон, Энтони Джеймс BS CSCI MATH Даунс, Кристофер Пол BS CSCI BADM ******************************************************* ********** СИФС 1 Андерсон, Ян BS BADM CIFS ******************************************************* ********** АККТ 23 Александр, Эми Элизабет BS BADM ACCT АККТ Айерс, Бриттани Николь BS BADM ACCT Браун, Лиши Семондре Шайрон, BS BADM ACCT Кэллоуэй, Логан Маккензи BS BADM ACCT Чайлдерс, Джейми Ли BS BADM ACCT Флик, Хизер Рени, BS BADM ACCT Фостер, Родни Тайрон BS BADM ACCT Галлман, Антонио Джеймс BS BADM ACCT бла-бла-бла-бла
Язык сценариев — простая английская Википедия, бесплатная энциклопедия
Язык сценариев или сценариев — это язык программирования, поддерживающий сценариев . Сценарии обычно представляют собой короткие компьютерные программы, выполняющие шаги, которые человек может выполнять по одному. Это автоматизирует работу, чтобы сделать ее проще и надежнее. Язык сценариев часто является более простым языком, и его легче изучать, чем другие языки, но он все же может делать многое.
Скрипты могут выполняться внутри другой программы, например, в веб-браузере или Microsoft Excel. Они также могут быть оболочкой , которая запускается из интерфейса командной строки и вызывает операционную систему (ОС). Оболочка считается интерактивной — пользователь может выбирать, что печатать, и оболочка отвечает на команду. Их можно использовать для управления заданиями на мейнфреймах и серверах.
Некоторые говорят, что язык сценариев должен быть привязан к конкретному использованию. Другие используют более широкое определение и включают языки программирования общего назначения, которые интерпретируются, а не компилируются. Универсальный означает, что его можно использовать разными способами для разных целей. Некоторые языки общего назначения (например, Java) имеют варианты, которые можно использовать в сценариях. Не существует конкретного правила относительно того, что является языком сценариев, а что нет.
Содержимое
- 1 Пример
- 2 Характеристики
- 3 История
- 4 типа скриптовых языков
- 4.1 Клейкие языки
- 4.2 Языки управления заданиями и оболочки
- 4.3 Скрипты графического интерфейса
- 4.4 Языки для конкретных приложений
- 4.5 Расширения/встраиваемые языки
- 5 Каталожные номера
- 6 Дальнейшее чтение
- 7 Другие сайты
Некоторые распространенные примеры языков сценариев:
- Оболочка Bash и C в качестве управляющих языков для Unix или Unix-подобных операционных систем
- Сценарии, которые выполняются внутри других приложений, называются языком расширения . Веб-браузеры поддерживают несколько типов сценариев, включая ECMAScript (JavaScript) или XUL. Например, на домашней странице Google используется JavaScript. Visual Basic для приложений используется внутри Microsoft Office. Lua — это язык, специально созданный как язык расширений, и его можно использовать во многих приложениях.
- Игры с расширениями сценариев включают виртуальный мир Second Life и симуляторы Trainz Railroad. В других играх, таких как Wesnoth, разнообразные реальные игры представляют собой сценарии, написанные другими пользователями.
- Языки обработки текста sed и AWK
- Общее назначение: Perl, [1] Tcl и Python [2] — это языки программирования высокого уровня (более близкие к человеческому языку, чем к машинному коду), которые можно использовать для самых разных целей. Некоторые из этих языков были сначала созданы для конкретного использования, а затем были преобразованы в языки общего назначения.
Большинство языков сценариев созданы для того, чтобы их было легко изучать. Зачастую это могут быть либо короткие файлы с исходным кодом, либо вводимые по одной команде в интерфейсе командной строки, который имеет цикл чтение-оценка-печать (REPL, языковая оболочка). [3] Обычно это означает простой набор команд. Там может не быть функций или основного , он просто работает от начала до конца. Если что-то не работает, программист может быстро внести изменения и запустить снова. Это делает язык сценариев подходящим для создания быстрого прототипа , чтобы проверить, работает ли идея.
Например, большинство людей не называют Java языком сценариев из-за его длинного синтаксиса и правил, определяющих, какие классы существуют в каких файлах, а также из-за того, что Java не может выполняться интерактивно в REPL. Ему нужны файлы с исходным кодом, и они могут содержать только определения, которые должны использоваться хост-приложением или средством запуска приложений. (Java — это не то же самое, что JavaScript).
Но Python позволяет выбирать — функции можно помещать в файл, его можно запускать без функций и использовать императивный стиль программирования или даже использовать его интерактивно (вводить и запускать по одной строке за раз).
печать ("Hello World")
Эта одна строка кода Python выводит «Hello World»; никакой функции main() или чего-либо еще не требуется.
Язык сценариев обычно интерпретируется из исходного кода или байт-кода. [4] Однако что-то должно запускать сценарий (интерпретировать его), чтобы компьютер его понял. Это приложение, или что-то в ОС. Это часто пишется на скомпилированном языке и распространяется в виде машинного кода (как исполняемый файл , который не имеет смысла для людей).
Языки сценариев могут быть разработаны для использования людьми, использующими программу — разработка для конечных пользователей. В других случаях они могут быть созданы программистами для собственного использования. Языки сценариев часто используют абстракцию, форму сокрытия информации. Это означает, что пользователям не нужно знать подробности о типах переменных, хранении данных и управлении памятью.
Сценарии часто создаются или изменяются исполняющим их лицом, [5] , но некоторые из них передаются или продаются другим. Например, когда большая часть игр написана на языке сценариев. Иногда сценарий может быть скомпилирован до того, как его используют другие. После компиляции он будет работать быстрее, и для его запуска не потребуется другое приложение. И это предотвращает изменение кода конечными пользователями.
Первые мейнфреймы (в 1950-х годах) не были интерактивными, а использовали сценарии, хранившиеся в пакетных файлах . Язык управления заданиями IBM (JCL) является распространенным примером языка сценариев, используемого для управления пакетной обработкой. [6]
Первые интерактивные оболочки были созданы в 1960-х годах для удаленного управления первыми системами с разделением времени. Они использовали сценарии оболочки, которые могут запускать компьютерные программы внутри компьютерной программы, оболочки. Кальвину Муерсу на его языке TRAC обычно приписывают изобретение подстановки команд . Это позволяет командам изменять сценарий (самоизменяющийся код). [7] Multics называет эти активные функции . [8] Луи Пузен написал ранний процессор для командных сценариев под названием RUNCOM для CTSS около 19 г.64. Стюарт Мэдник из Массачусетского технологического института написал язык сценариев для IBM CP/CMS в 1966 году. Первоначально он назвал этот процессор COMMAND, а позже — EXEC. [9] Multics включала ответвление CTSS RUNCOM, также называемое RUNCOM. [10] EXEC в конечном итоге был заменен на EXEC 2 и REXX.
Такие языки, как Tcl и Lua, с самого начала создавались как языки сценариев общего назначения, которые можно было использовать в любом приложении. Другие языки, такие как Visual Basic для приложений (VBA), могут делать то же самое, но должны работать только с определенными приложениями. Использование языка сценариев общего назначения вместо создания нового языка для каждого приложения обычно упрощает задачу как для человека, пишущего приложение, так и для пользователя, пишущего сценарии.
Склеивание языков[изменить | изменить источник]
Сценарии иногда используются для соединения различных приложений. Это называется связующим кодом, и язык, созданный специально для этой цели, называется связующим языком . Конвейеры и сценарии оболочки являются распространенными примерами связующих языков. Но если в файл скрипта записывается много логики, то лучше воспринимать его как просто еще одно программное приложение, а не «клей».
Склеивающие языки особенно полезны для написания и обслуживания:
- пользовательские команды для командной оболочки;
- программ меньшего размера, чем те, которые лучше реализованы на скомпилированном языке;
- программы-оболочки, которые выполняют некоторые автоматизированные действия до или после запуска приложения, такого как электронная таблица, база данных, компилятор и т. д.;
- скрипта, которые могут часто меняться;
Примеры клеевого языка:
- AppleScript
- авк
- ЛКЛ
- Луа
- м4
- Перл
- Скрипты Unix Shell (ksh, csh, bash, sh и другие)
- VBScript
- Язык рабочего процесса
- Windows PowerShell
- XSLT
Такие устройства, как программируемые калькуляторы, также могут иметь свои собственные связующие языки. Например, Texas Instruments TI-92 по умолчанию может быть запрограммирован на языке командных сценариев. Калькулятор TI-NSpire понимает язык Lua. Другие понимают какой-то язык Basic, или, может быть, Lisp или что-то еще.
Языки и оболочки управления заданиями[изменить | изменить источник]
Основная статья: Сценарий оболочки
Эта группа пришла из автоматизации управления заданиями, которая связана с запуском и управлением поведением системных программ, начиная с IBM JCL. Интерпретаторы многих из этих языков также работают как интерпретаторы командной строки, такие как оболочка Unix или MS-DOS COMMAND.COM
. Другие, такие как AppleScript, предлагают использование англоязычных команд для создания сценариев.
Скрипты GUI[изменить | изменить источник]
При построении графических пользовательских интерфейсов необходим способ его тестирования. Были созданы специализированные языки сценариев для управления графическими окнами, меню, кнопками и т. д. так же, как это сделал бы пользователь-человек. Во многих случаях их можно использовать для точного копирования того, что делает человек (перемещение мыши, щелчок или набор текста на клавиатуре). Это действие или набор действий, которые копируются и запоминаются, называется макросом.
Языки для конкретных приложений[изменить | изменить источник]
Многие крупные приложения содержат язык сценариев, созданный специально для этого приложения. Приложением может быть игра или деловая программа. Этот тип языка создан для одного приложения. Они выглядят как языки общего назначения (например, QuakeC, созданный по образцу C), у них есть специальные функции, которые их отличают.
Расширение/встраиваемые языки[изменить | изменить источник]
Это похоже на языки сценариев для конкретных приложений, поскольку он управляет приложением, но этот язык можно использовать во многих приложениях.
JavaScript начинался как язык сценариев внутри веб-браузеров; но теперь это встраиваемый язык общего назначения. Например, он также используется в продуктах Adobe.
Некоторые языки со временем переходят от одного типа к другому, обычно по мере того, как добавляются новые возможности.
- ↑ Шеппард, Дуг (16.10.2000). «Введение в Perl для начинающих». dev.perl.org. Проверено 8 января 2011 г. .
- ↑ Программирование — это сложно, давайте писать сценарии…, Ларри Уолл, 6 декабря 2007 г.
- ↑ Привет, Тони; Папай, Гюри (2014). Компьютерная вселенная: путешествие через революцию . Издательство Кембриджского университета. п. 76. ISBN 978-1-31612322-5 .
Основной характеристикой современных языков сценариев является их интерактивность, которую иногда называют средой программирования REPL . […] Характеристики простоты использования и немедленного выполнения в среде REPL иногда воспринимаются как определение языка сценариев.
- ↑ Браун, Вики. «Скриптовые языки». Проверено 22 июля 2009 г.