Как создать и запустить сценарий powershell в windows 10

Содержание:

Как создавать объекты в PowerShell

Обнаружил, что поисковики рунета выдают в основном устаревшие методы типа add-member. Как создавать объекты, почему именно так и зачем это надо в переводе от гуру PowerShell. Вы ознакомитесь с приемом создания объекта из хеш таблиц, и узнаете несколько трюков по работе с ними.
PowerShell in DepthГлава 21.1 Техника номер 1. Использование хеш таблиц для создания кастомных объектов.
Давайте начнем приема которым обычно мы пользуемся сами, когда нам нужно создать свой собственный объект или объеденить информацию из разных объектов в один для последующего вывода. Мы называем этот путь официальным, или рекомендуемым. Мы пользуемся именно им, потому что он позволяет легко писать код, хорошо читаем и в конечном итоге позволяет сделать быстрее свою работу.
Этот способ продемонстрирован в листинге 21.2 ниже

Меняем цвета в PowerShell

Совершено недавно открыл для себя эту оболочку. Тут же полез искать книги, которые, кстати, уже перевели и их можно взять отсюда. И все вроде бы хорошо, и код пишется легко и интеграция с vsb-скиптами, но, почему то, тянет меня к мастдайным окнам.
И так, было решено перекрасить окошко PowerShell в стандартный цвет cmd и параллельно настроить автозапуск собственных функций и алиасов. Так же, слегка, напрягало предложения ввода с надписью — PS, которое, совместно с цветом, напоминает лого Adobe Photoshop ( Ничего против Adobe не имею ).Итак, информация следом исключительно для новичков.

Использование командлета Invoke-WebRequest

Командлет Invoke-WebRequest (псевдоним wget) может отправлять и получать HTTP, HTTPS и FTP запросы, обрабатывать возвращаемый сервером ответ. Полученный ответ представляет собой набор коллекции форм, ссылок, изображений и других важных элементов HTML документа.

Попробуем выполнить следующую команду:

Совет. Если вы подключены к Интернет через прокси-сервер то для корректной работы командлетов PoweShell, воспользуйтесь советами из статьи: Как настроить PowerShell для доступа через прокси-сервер.

Как вы видите, возвращенный ответ представляет собой не простой HTML код страницы. Вы видите различные свойства web-документа. Командлет Invoke-WebRequest, как и большинство других командлетов PowerShell оперирует объектами. Invoke-WebRequest возвращает объект типа HtmlWebResponseObject. Посмотрим все свойства данного объекта:

Чтобы получить сырой HTML код веб страницы, который содержится в данном объекте, выполните:

Вы можете вернуть HTML код вместе с HTTP заголовками, которые вернул веб сервер:

Вы можете проверить только код ответа веб-сервера и HTTP заголовки HTML страницы:

Как вы видите, веб сервер вернул ответ 200, т.е. запрос выполнен успешно и веб сервер доступен и работает корректно.

Передача параметров

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

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

Теперь, для вызова функции, требуется передавать два параметра:

При вызове функции мы передаем два обязательных параметра со значениями. Эти значения, внутри функции, будут доступны под названиями $param1 и $param2. Эти переменные мы передаем в команду получения и фильтрации логов.

Установка значений по умолчанию

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

Мы должны всегда указывать ключ param2, что добавляет немного работы. Что бы это исправить достаточно поменять их местами:

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

Возвращение значений

В отличие от других языков, если мы присвоим переменной $result результат функции Get-DayLog, то она будет содержать значения:

Это будет работать до тех пор, пока мы не решим изменить функцию присвоив переменные:

Мы не можем получить результат используя переменную $result, так как функция не выводит информацию, а хранит ее в переменной $events. Вызывая $events мы тоже не получаем информацию, так как тут работает понятие «область видимости переменных».

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

Я бы рекомендовал всегда возвращать значения через return, а не использовать вывод используя команды типа Write-Output внутри функции. Использование return останавливает работу функции и возвращает значение, а это значит что его не стоит ставить по середине логики если так не планировалось.

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

Я вернул оба значения разделив их запятой. По умолчанию всегда возвращается массив. Массивы в Powershell это набор не именованных параметров. Более подробно  о них мы уже писали.

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

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

Подробно о хэш таблицах в Powershell вы можете почитать в предыдущих статьях. Далее так же будет несколько примеров с ними.

Вы можете возвращать любой тип данных и в любом формате и последовательности. Каждый из них имеет своё преимущество.

Область видимости переменных

Все переменные объявленные до момента вызова функции могут быть ей использованы:

Такой подход не запрещает переопределить переменную внутри функции дав ей другое значение:

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

Такие переменные называются глобальными. Объявляются приставкой $global:

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

Парсинг HTML страниц с помощью Powershell

Командлет Invoke-WebRequest позволяет довольно быстро и удобно парсить содержимое любых веб-страниц. При обработке HTML страницы из ее содержимого формируются коллекции ссылок (links), веб-форм (forms), изображений (images), скриптов (scripts) и т.д.

Затем выведем список всех изображений на данной странице:

Сформируем коллекцию из полных url путей к используемым изображениям:

Инициализируем новый экземпляр класса WebClient:

И скачаем все изображения со страницы (с оригинальными именами) в каталог c:\tools\:

В качестве интересного примера использования командлета Invoke-WebRequest можно привести способ узнать внешнего IP адреса компьютера из PowerShell.

Версии Windows PowerShell

Первая версия PowerShell 1.0 появилась 14 ноября 2006 года и выпускалась в виде отдельного дистрибутива, который можно было установить на следующие версии операционных систем Windows: Windows XP Service Pack 2, Windows Server 2003 Service Pack 1 и Windows Vista.

В Windows Server 2008 PowerShell 1.0 поставлялся в виде компонента, который также нужно было устанавливать.

Начиная с Windows 7 и Windows Server 2008 R2, PowerShell поставляется как неотъемлемый компонент системы (т.е. предустановленный, устанавливать его не надо). Ниже представлена таблица соответствия версии PowerShell и версии операционной системы Windows (т.е. какая версия PowerShell по умолчанию установлена в той или иной версии Windows):

Версия PowerShell Версии Windows
PowerShell 2.0 Windows 7, Windows Server 2008 R2
PowerShell 3.0 Windows 8, Windows Server 2012
PowerShell 4.0 Windows 8.1, Windows Server 2012 R2
PowerShell 5.0 Windows 10, Windows Server 2016

С каждой новой версией PowerShell становится все более мощным инструментом администрирования, для сравнения в первой PowerShell было около 130 командлетов, а в PowerShell 5.0 их уже более 600!

Узнать текущую версию PowerShell можно с помощью свойства PSVersion встроенной переменной $PSVersionTable, например, выполните следующую команду:

  $PSVersionTable.PSVersion

Или запустите командлет

  Get-Variable -Name PSVersionTable –ValueOnly

где, значение PSVersion и будет версией PowerShell.

Что такое Windows PowerShell

Windows PowerShell – это скриптовый язык и программа с интерфейсом командной строки для выполнения этих скриптов. Данный язык был выпущен в 2006 году в составе второго сервис-пака для Windows XP и с тех пор PowerShell является частью всех операционных систем от Microsoft. В 2008 году появилась вторая версия данного языка, и начиная с Windows 7 используется именно она. Файлы со скриптами Windows PowerShell имеют расширение PS1 и могут запускаться как привычные всем BAT и CMD файлы.

Windows PowerShell – это скриптовый язык, который разрабатывался в первую очередь для бизнес-клиентов Microsoft, которым необходимо мощные инструменты для автоматизации задач по управлению серверами и компьютерами на базе Windows. В качестве основы для данного языка была использована платформа .NET, разрабатываемая компанией Microsoft с 2002 года.

Windows PowerShell позволяет автоматизировать массу разнообразных задач. С его помощью можно управлять файлами, службами, процессами, аккаунтами и настройками. Язык PowerShell понимает многие команды из обычной Командной строки Windows (CMD), но он имеет и свой собственный язык, состоящий из собственных команд, которые здесь называются командлетами.

Командлеты (на английском cmdlets) формируются по правилу Глагол-Существительное, например, Get-Help. Ознакомиться с основами Windows PowerShell можно с помощью справки (командлет «Get-Help»). Для получения общей информации просто введите команду «Get-Help», для получения справки о конкретном командлете введите «Get-Help Имя-командлета». Например, если ввести команду «Get-Help Get-Process», то мы получим справку о командлете Get-Process.

Установка/обновление PowerShell Core 7.0

Обратите внимание, что последняя версия Windows PowerShell, устанавливаемая в Windows 10 и Windows Server 2109 — PowerShell 5.1. Вместо нее Microsoft начала разрабатывать кроссплатформенную версию PowerShell Core

На данный момент доступны версии PowerShell Core 6.0, 6.1, 6.2 и 7.0. По сути PowerShell Core это новая платформа, которая устанавливается в системе вместе с Windows PowerShell. Т.е. нельзя обновить PowerShell 5.1 до PowerShell Core 7.0.  PowerShell 7 устанавливается на компьютере отдельно от Windows PowerShell 5.1.

Если у вас уже установлен PowerShell Core 6.0, вы можете обновить версию PowerShell на своем компьютере до последней версии PowerShell 7.0 Core (либо можно установиь PowerShell Core 7.0 рядом с Windows PowerShell 5.1). В этом примере мы попробуем обновить версию PowerShell Core в Windows 10 1909. Есть два способа обновления:

  • Можно вручную скачать msi установщик PowerShell Core на GitHub
  • Можно скачать и запустить установку (обновление) непосредственно из консоли PowerShell

Если вы хотите установаить PowerShell Core с помощью MSI пакета, перейдите на старицу проекта https://github.com/PowerShell/PowerShell, найдите последний релиз (на момент написания статьи это v7.0.0 Release of PowerShell от 4 марта, доступны также более новые v7.1.0-preview Release of PowerShell, но лучше пока не ставить их до выхода стабильной версии). Разверните список Assets и найдите пакет для вашей версии Windows (PowerShell-7.0.0-win-x64.msi или PowerShell-7.0.0-win-x86.msi).

Скачайте msi файл и установите его.

Для установки PowerShell Core из MSI пакета средствами SCCM/MDT/скриптами можно использовать команду с такими параметрами:

Вы можете обновить PowerShell непосредственно из консоли.

Обновим (установим) последнюю версию PoSh Core с помощью команды:

Можно использовать дополнительные параметры установки:

  • -Destination – каталог установки PowerShell Core
  • -Preview – установка Preview версии
  • -Quiet – тихая установка
  • -AddToPath – добавить путь к каталогу установки PowerShell Core в переменные окружения

Данная команда загружает установочный MSI файл PowerShell 7.0 с GitHub и запускает установку, затем запускается установка через MSI Installer.

После окончания установки открывается окно PowerShell Core (pwsh.exe), проверьте версию PowerShell и убедитесь, что теперь это PoSh 7.0.0.

Если у вас установлен менеджер пакетов Chocolatey, вы можете установить или обновить версию PowerShell командами:

Обратите внимание, что имя исполняемого файла среды PowerShell изменился. Теперь это

У него собственная иконка в меню Start.

  • Для запуска Windows PowerShell, основанного на .NET Framework используется команда
  • Для запуска PowerShell Core, основанного на .NET Core, нужно использовать команду

Т.е. теперь на этом компьютере есть две версии: Windows PowerShell 5.1 и PowerShell Core 7.0

Чтобы запустить предыдущую версию PowerShell, например 4, используйте команду:

Шаг 3: установка файлов помощи

Команды вроде cd и dir не являются активными командами оболочки PowerShell. Это так называемые псевдонимы (aliases) —  замены настоящих команд PowerShell. Псевдонимы удобны для тех, кто имеет большой опыт работы с командной строкой. Однако они не затрагивают глубин PowerShell.

Чтобы начать знакомиться с возможностями PowerShell, наберите help и нужную вам команду. На скриншоте показана команда help dir.

Команда help говорит, что dir является псевдонимом команды PowerShell Get-ChildItem. Если набрать get-childitem в PS C:\>, увидите то же самое, что и при использовании команды dir.

Как указано внизу скриншота, файлы помощи для PowerShell не устанавливаются автоматически. Для их получения запустите PowerShell от имени администратора и наберите update-help. Установка файлов помощи займёт несколько минут, ряд модулей могут отсутствовать —  например, в данном случае не установились Help for NetWNV и SecureBoot. Когда всё готово, полная система помощи всегда будет давать нужные подсказки.

Теперь наберите команду get-help и любую интересующую вас команду («cmdlet» на языке PowerShell, по-русски командлеты), будет показано её описание. Например, get-help get-childitem выдаёт список опций get-childitem. Также можно вывести разные возможные варианты. Например

get-help get-childitem -examples

выдает семь подробных примеров использования get-childitem. Команда

get-help get-childitem -detailed

включает в себя эти семь примеров и подробные разъяснения каждого параметра в командлете get-childitem.

Создание файла сценария PowerShell

В Windows 10 файлы сценариев PowerShell можно создавать с помощью практически любого текстового редактора или консоли интегрированной среды сценариев (ISE).

Создание скрипта с помощью блокнота

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

  1. Откройте приложение «Блокнот».
  2. Создайте или вставьте сценарий. Например: Write-Host ««Поздравляем! Ваш первый скрипт успешно выполнен»»

    Вышеприведенный скрипт просто выводит на экране фразу «Поздравляем! Ваш первый скрипт успешно выполнен».

  3. Сохраните файл под любым удобным названием, например, first_script.ps1

Создание сценария с помощью интегрированной среды сценариев

Кроме того, консоль PowerShell ISE можно использовать для кодирования сценариев в Windows 10. Интегрированная cреда сценариев является сложным инструментом, но вы можете начать работу с помощью этих шагов:

  1. Откройте системный поиск и введите запрос Windows PowerShell ISE, щелкните правой кнопкой мыши верхний результат, и выберите Запуск от имени администратора или выберите соответствующий параметр в правой колонке.
  2. В PowerShell ISE создайте пустой файл .ps1, в котором можно создать или вставить скрипт. Например:

    Write-Host ««Поздравляем! Ваш первый скрипт успешно выполнен»»

  3. Откройте меню Файл и нажмите кнопку Сохранить.
  4. Введите название сценария. Например, first_script_ise.ps1
  5. Сохраните скрипт.

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

Дополнительные возможности работы с параметрами

Строгие типы данных

Powershell автоматически преобразует типы данных. В отличие от других языков результат этого выражения будет число 3, а не «111»:

Такой подход может привести к ошибке. Мы можем исправить это объявляя типы:

То есть объявляя типы данных мы либо получим ошибку избежав неверного преобразования. Если бы мы передавали такую строку «1», то у нас корректно выполнилось преобразование в число.

Таких типов данных в Powershell  всего 13:

  • — строка;
  • — 16-битовая строка Unicode;
  • — 8 битовый символ;
  • — целое 32 битовое число;
  • — целое 64 битовое число;
  • — булево значение True/False;
  • — 128 битовое число с плавающей точкой;
  • — 32 битовое число с плавающей точкой;
  • — 64 битовое число с плавающей точкой;
  • — тип данных даты и времени;
  • — объект xml;
  • — массив;
  • — хэш таблица.

Примеры работы с некоторыми типами данных вы увидите далее.

$args

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

Обратите внимание, что $args является массивом и значение получаются по индексу. Я не ставлю запятую при вызове функции так как в этом случае у меня был бы массив двойной вложенности

Обязательные параметры Mandatory

Попробуем выполнить следующий пример, который должен вернуть дату изменения файла:

Первый вызов функции прошел успешно, так как мы передали параметры. Во втором случае мы не передаем значения, а значит переменная $item равна $null (неопределенному/неизвестному значению). Во многих языках, в таких случаях, у нас появилась бы ошибка еще в момент вызова функции Get-ItemCreationTime, а не во время выполнения Get-Item.

Представьте что до получения даты изменения файла будут еще какие-то действия, например удаление и создание файлов, которые могут привести к поломке компьютера или программы. Что бы этого избежать можно объявить этот параметр обязательным:

Атрибут Mandatory обязывает указывать значение. Если оно будет проигнорировано, то мы получим ошибку еще до момента выполнения функции.

Param()

Вы могли видеть функции, которые имеют значение Param(). Это значение так же объявляет параметры. На предыдущем примере это значение использовалось бы так:

Microsoft Рекомендует использовать именно такой синтаксис написания функции, но не обязывает его использовать. Такой синтаксис говорит, что это не просто функция, а командлет.

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

Position говорит под каким номером передается значение.

Одно из преимуществ работы с param() в том, что у нас становятся доступны ключи типа -Confirm и -Verbose. 

CmdletBinding()

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

На примере ниже я установил ограничение на длину строк с 1 по 13 символов с помощью ValidateLength(1,13). Position=1 говорит об индексе элемента в массиве:

Таких дополнительных аргументов для команд достаточно много. Для примера еще несколько атрибутов, которые можно добавить в блок parameter:

  • HelpMessage = «Текст»  — подсказка по использованию переменной. Это пояснение можно увидеть при запросе справки через Get-Help;
  • ParameterSetName=»Computer» — указывает к какой переменной относятся параметры;

Отдельные блоки типа :

  • — устанавливает алиас для этого параметра в виде буквы t;
  • — устанавливает значение по умолчанию переменной Test;
  • ] — такое использование говорит, что значение принимает массив строк
  • — позволяет обязательным параметрам быть $null
  • — позволяет обязательным параметрам быть пустой строкой
  • — обязательный параметр с пустым массивом
  • — минимальное и максимальное количество значений.
  • «)] — проверка на шаблон используя регулярного выражения

Больше примеров и аргументов на сайте Microsoft.

Автоматизация легкого управления списками баз 1С

Наверное, вам в работе, как и мне, часто приходится заниматься ИТ-системами компаний, которые до тебя непонятно кем и как обслуживались. Прежде чем полноценно поставить компанию на обслуживание необходимо обязательно сделать ИТ-Аудит и привести все системы в порядок.
Часто одной из систем, где порядок отсутствует, является система 1С. Например, можно встретить базы с названием папок «new_copybase1_old» или «База1КомпанияЗП», или вообще вложенные друг в друга папки.
Кто и какой имеет к данным базам доступ определить порой крайне сложно. Списки баз на клиентских компьютерах, в самом приложении 1С, тоже могут быть названы непонятно. В общем, не очень радостная картина.
Если у вас пришло время привести все базы к одному общему стандарту и автоматизировать подключение пользователей, то прошу под кат.

Запуск сеанса PowerShellInitiating a PowerShell session

  1. Чтобы запустить сеанс PowerShell с устройством Windows 10 IoT базовая, сначала необходимо создать отношение доверия между основным компьютером и устройством.To start a PowerShell session with your Windows 10 IoT Core device, you’ll first need to create a trust relationship between your host PC and your device. После запуска устройства Windows IoT базовая на экране, подключенном к устройству, будет отображаться IP-адрес.After starting your Windows IoT Core device, an IP address will be shown on the screen attached to the device.

    Те же сведения можно найти на панели мониторинга Windows 10 IoT базовая.You can find the same information on the Windows 10 IoT Core Dashboard.

  2. Откройте консоль PowerShell с правами администратора на локальном компьютере.Open an administrator PowerShell console on your local PC. Введите PowerShell в поле Искать в Интернете и Windows рядом с меню Пуск Windows.Type powershell in the Search the web and Windows box near the Windows Start menu. Windows обнаружит PowerShell на своем компьютере.Windows will find PowerShell on your PC.

  3. Чтобы запустить PowerShell от имени администратора, щелкните правой кнопкой мыши Windows PowerShellи выберите команду Запуск от имени администратора.To start PowerShell as an administrator, right-click Windows PowerShell, and then select Run as administrator.

    Теперь вы увидите консоль PowerShell.Now you should see the PowerShell console.

  4. Для включения удаленных подключений может потребоваться запустить службу WinRM на рабочем столе.You may need to start the WinRM service on your desktop to enable remote connections. Для этого в консоли PowerShell введите следующую команду:To do so, from the PowerShell console, type the following command:

  5. В консоли PowerShell введите следующую команду, подставив с соответствующим значением (с помощью имени компьютера проще всего, но если устройство не имеет уникального имени в сети, попробуйте использовать IP-адрес):From the PowerShell console, type the following, substituting with the appropriate value (using your machine-name is the easiest, but if your device is not uniquely named on your network, try the IP address):

  6. Введите , чтобы подтвердить изменение.Enter to confirm the change.

Примечание

Если вы хотите подключить несколько устройств, можно использовать запятые и кавычки для разделения каждого устройства.If you want to connect multiple devices, you can use commas and quotation marks to separate each device.

  1. Теперь вы можете начать сеанс работы с устройством Windows IoT Core.Now you can start a session with your Windows IoT Core device. В консоли PowerShell с правами администратора введите:From you administrator PowerShell console, type:

  2. В диалоговом окне Учетные данные введите следующий пароль по умолчанию: In the credential dialog, enter the following default password:

    МЕТИМ NOTE

    Процесс подключения не является медленным и может занять до 30 секунд.The connection process is not immediate and can take up to 30 seconds.

    Если вы успешно подключились к устройству, вы должны увидеть IP-адрес устройства перед запросом.If you successfully connected to the device, you should see the IP address of your device before the prompt.

  3. Обновите пароль учетной записи.Update your account password. Настоятельно рекомендуется обновить пароль по умолчанию для учетной записи администратора.We highly recommend that you update the default password for the Administrator account. Для этого выполните следующие команды в подключении PowerShell:To do this, issue the following commands in your PowerShell connection:

    а)a. Замените строгим паролем:Replace with a strong password:

    б.b. Затем установите новый сеанс PowerShell с помощью и с новыми учетными данными.Next, establish a new PowerShell session using and with the new credentials.

Использование PowerShell для администрирования Microsoft SQL Server

В одном посте невозможно описать все возможности, появившиеся после введения поддержки Window Powershell в Microsoft SQL Server, однако этим постом я постараюсь показать хотя бы часть этих возможностей. В состав SQL Server, начиная с версии SQL Server 2008, входят две оснастки:

  1. Поставщик (Provider) SQL Server, предоставляющий простой механизм навигации – «внутри» SQL Server, можно использовать команды dir, ls, cd, Set-Location, Get-Location и т.д.;
  2. Набор командлетов для указания действий SQL Server (например, выполнение скрипта sqlcmd).

Таким образом, сейчас, вы можете без применения стороннего ПО получать в своих скриптах на PowerShell всю необходимую информацию с SQL Server.

Передача через конвейер или Pipeline

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

Если мы захотим использовать подход описанный выше, создав новые команды в виде функций, то конвейер не будет работать:

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

Таких атрибутов всего два:

  • ValueFromPipelineByPropertyName — получение значения из конвейера по имени;
  • ValueFromPipeline — получение через конвейер только значения .

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

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

Если бы мы не указали блок Process функция бы вернула только последней результат из массива 1..5:

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

Как уже писалось ValueFromPipelineByPropertyName принимает только именованные параметры и в случае с именем «bad» мы получаем ошибку:

  • Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера
  • The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

Причем передавать именованные параметры через хэш таблицы мы не можем, только через pscustomobject.

Вы можете указывать сразу два атрибута таким образом:

Это позволит использовать и значение с именем, если оно указано либо без него. Это не спасет вас от ситуации, если вы передаете параметр с другим именем:

Передача через конвейер нескольких значений

Для примера рассмотрим ситуацию, где нам нужно передать через конвейер два значения. Если Get-SomeNum будет возвращать массив, то через конвейер у нас будет проходить каждое число по отдельности. Это еще один повод использовать именованные параметры:

Получаем версию PowerShell на удаленных компьютерах

Для получения версии PowerShell на удаленных компьютерах нужно использовать значение переменной окружения $PSVersionTable или получать данные непосредственно из реестра. Другие способы могут возвращать некорректные данные.

Вы можете получить версию PowerShell с удаленного компьютера с помощью команды Invoke-Command:

Major Minor Build Revision PSComputerName
----- ----- ----- -------- --------------
5 1 14393 3383 dc01

Можно получить установленные версии PowerShell с нескольких компьютеров таким скриптом (их список сохранен в текстовом файле):

Либо можно получить список компьютеров домена через Get-ADComputer и получить версию PowerShell на них:

Если ваш скрипт PoweShell использует специальный функционал определенной версии PS, вы можно принудительно переключиться в режим другой версии PowerShell. Например, для запуска консоли в режиме PowerShell v3, выполните (должен быть установлен .Net Framework 3.5):

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

В следующей статье мы рассмотрим, как обновить версию PowerShell в Windows.

Написание и запуск скриптов

Скрипты сохраняются в виде файлов с расширением .ps1. Несмотря на то, что PowerShell уже давно является нативной частью ОС Windows, вы не сможете запустить его скрипты простым двойным щелчком. Для этого надо кликнуть правой кнопкой по скрипту и выбрать «Запустить в PowerShell».

Хакатон Tour.Hack

Ивент перенесён на 26–27 сентября, Новосибирск, беcплатно

tproger.ru

События и курсы на tproger.ru

Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду Get-ExecutionPolicy. Результатом будет одно из следующих значений:

  • Restricted — выполнение скриптов запрещено. Стандартная конфигурация;
  • AllSigned — можно запускать скрипты, подписанные доверенным разработчиком; перед запуском скрипта PowerShell запросит у вас подтверждение;
  • RemoteSigned — можно запускать собственные скрипты или те, что подписаны доверенным разработчиком;
  • Unrestricted — можно запускать любые скрипты.

Для начала работы необходимо изменить настройку политики запуска на RemoteSigned, используя команду Set-ExecutionPolicy:

Командлеты

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

  • существуют системные, пользовательские и опциональные командлеты;
  • результатом выполнения командлета будет объект или массив объектов;
  • командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;
  • командлеты нечувствительны к регистру, так что нет никакой разницы между Get-ADUser, get-aduser и gEt-AdUsEr;
  • в качестве разделителя используется символ ; .

Каждый командлет содержит в себе глагол и существительное, разделяемые дефисом. Например:

  • Get-Process — отобразить текущие процессы, запущенные на компьютере;
  • Get-Service — отобразить список служб и их статус;
  • Get-Content — отобразить содержимое указанного файла, например Get-Content C:\Windows\System32\drivers\etc\hosts.

При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category:

Также можно создавать и свои собственные командлеты.

Параметры

У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW* выводит список служб, у которых имя начинается с W. Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member. Например, Get-Process | Get-Member:

Если вы не нашли того, что нужно, или не уверены в том, как правильно задаются параметры, можно даже запросить примеры с помощью параметра -Examples:

Некоторые командлеты также могут вызываться с помощью алиасов, например вместо Get-Help можно просто написать Help.

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

Конвейер

PowerShell позволяет осуществлять обмен данными между командлетами с помощью конвейера. Например:

  • GetService | SortObject -property Status — сортировка запущенных служб по статусу;
  • “Hello World!” | Out-File C:\ps\test.txt — запись текста в файл.

Можно использовать несколько конвейеров. Например, следующий скрипт выводит список имён всех служб за исключением остановленных:

Get-Service | WHERE {$_.status -eq “Running”} | SELECT displayname

Глава 21. Часть 2 — Создание объектов и вывод данных объектами. PowerShell in depth — Don Jones, Richard Siddaway

здесь перечислены разные способы создания объектов PowerShell. Даны советы и трюки. Текст великоват. Для всех изучающих пошик.Кроме удобства чтения, количество нажатий на клавиши, требования к сохранению порядка свойств, все эти методы по существу делают тоже самое. Несколько тонких различий: техника 1, хэш таблица. Как правило самая быстрая, техника 2 медленнее, техника 3 может быть значительно медленнее.
В хорошей рецензии learn-powershell.net/2010/09/19/custom-powershell-objects-and-performance измерена скорость создания объектов выполненная MVP Boe Prox. Проводится сравнение скорости работы трех методов, работа Add-Member в 10 раз медленнее. Так что это плюс к технике 1. Мы не тестировали технику 4 как это делал Boe, но наши тесты показывают что техника 4 быстрее на 10% чем техника 1. Техника 5 должна быть использована в тех случаях когда типизация свойств имеет значение.

Сам перевод:21.2 Синтаксис для создания пользовательских объектов
Мы часто говорили, что всегда есть несколько способов сделать что-либо в PowerShell, и это, верно для пользовательских объектов. Мы покажем вам все основные пути, потому что вы, наверняка столкнетесь с ними в жизни, мы хотим, чтобы вы могли распознать их и использовать их, когда вы захотите.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *