sonyps4.ru

Приступаем к работе с PowerShell. Изучение PowerShell — книги и ресурсы

PowerShell - это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий IT-профессионалам более широкие возможности для конфигурирования операционных систем семейства MS Windows. Проще говоря, это своего рода универсальный инструмент администрирования. В данной статье будут рассмотрены базовые приёмы написания скриптов на PowerShell, позволяющие простым путём автоматизировать управление Windows-окружением.

PowerShell предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов. Для запуска интерфейса командной строки введите powershell в меню «Выполнить» (WinKey + R). PowerShell ISE запускается с помощью команды «PowerShell ISE» в том же меню.

ISE более предпочтительно, так как предоставляет более широкие возможности разработчику благодаря подсветке синтаксиса, функции автозаполнения кода и другим особенностям, присущим многим «большим» IDE.

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

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

Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду 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

Заключение

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

1. Написание скрипта

Скрипт PowerShell (не важно какой версии) - это текстовый файл с расширением *.ps1 .

Вот пример простого Power Shell срипта (файл systemInfo.ps1 ):

# Retrieve WMI object for the operating system

Get-WmiObject Win32_OperatingSystem

Этот файл можно создавать и редактировать, например, в FAR Manager.

Обратите внимание , что FAR Manager хоть и может работать в консоли Power Shell, но выполняет из-под себя скрипты в окружении обычной Windows-консоли cmd . То есть, FAR Manager можно использовать только для создания и редактирования PowerShell скриптов, но не для запуска. Но прежде чем разочаровываться, прочитайте пункт 3.

2. Запуск срипта

Скрипт нужно выполнять из консоли Power Shell, а не из обычной консоли Windows. В консоли Power Shell необходимо перейти в каталог, где лежит скрипт (командами cd ), и затем запустить сам скрипт, обязательно прописав перед ним символы ".\" . Например, имеем путь к файлу скрипта d:\work\systemInfo.ps1 . Тогда команды запуска будут выглядеть так:

cd \

cd work

.\systemInfo.ps1

или так (просто указывается полный путь к скрипту):

d:\work\systemInfo.ps1

Скорее всего, при запуске скрипта появится следующая ошибка:

Не удается загрузить файл D:\work\systemInfo.ps1, так как выполнение скриптов запрещено для данной системы. Введите "get-help about_signing" для получения дополнительных сведений.

строка:1 знак: 18

CategoryInfo: NotSpecified: (:) , PSSecurityException

FullyQualifiedErrorId: RuntimeException

Ошибка появляется из-за того, что по-умолчанию в Power Shell включена максимальная политика безопасности, которая позволяет выполнять команды PowerShell в командной строке, но не позволяет в той же командной строке выполнить скрипт с командами PowerShell.

Чтобы резрешить выполнение PowerShell скриптов, нужно создать *.bat файл, например enableScript.bat со следующим содержимым:

powershell -Command Set-ExecutionPolicy RemoteSigned

Этот *.bat файл можно выполнить в любой консоли: хоть в PowerShell, хоть в обычной cmd . После выполнения этого файла, PowerShell-скрипты станут запускаться в консоли PowerShell.

3. Запуск PowerShell-скрипта из обычной Windows-консоли cmd

Скрипт PowerShell можно выполнить и из обычной консоли Windows. Для этого можно воспользоваться командой:

Powershell -File ./systemInfo.ps1

Таким образом можно выполнять скрипты прямо из FAR Manager, и они будут работать.

Но тут есть небольшая тонкость. Параметр -File срабатывает только на локальных путях, даже если путь указан относительный "./" . То есть, если *.ps1 - файл лежит на локальном диске C: или D: , то такой вызов будет работать. Но если попробовать выполнить скрипт, расположенный на доменном ресурсе, то скрипт не будет найден. Возможно, это исправят в следующих версиях PowerShell.

Windows PowerShell 2.0 был выпущен в составе Windows 7 и Windows Server 2008 R2 как неотъемлемый компонент системы. Кроме того, вторая версия доступна и для других систем, таких как Windows XP SP3, Windows Server 2003 SP2, Windows Vista SP1 и Windows Server 2008.

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

Windows PowerShell построен на базе Microsoft NET Framework и интегрирован с ним. Дополнительно PowerShell предоставляет удобный доступ к COM, и ADSI, равно как и позволяет выполнять обычные команды командной строки, чтобы создать единое окружение, в котором администраторы смогли бы выполнять различные задачи на локальных и удалённых системах.

Работа с командами

Разработчики PowerShell оснастили эту оболочку особым языком сценариев, построенным в соответствии со стандартом.NET Framework. Команда в PowerShell называется командлет или cmdlet в оригинале. Командлет подобен функции в том плане, что он выполняет конкретную задачу, например извлекает содержимое папки или обновляет запись реестра и имеет параметры которые могут изменять результат работы команды.

В оболочку PowerShell встроено свыше 100 команд. Так же можно создавать дополнительные команды, но при этом следует пользоваться языком стандарта.NET, таким как Visual Basic .NET или C#.

Каждый вариант команды представляет собой комбинацию «глагол-существительное». Это объясняется тем, что специалисты Microsoft хотели использовать единообразную схему именования и тем самым облегчить изучение, а также расширение оболочки PowerShell. Глагол указывает на действие, которое предстоит совершить, а существительное - на тип объекта, над которым будет совершаться данное действие. К примеру, команда Get-ChildItem считывает список элементов текущего рабочего каталога или контейнера, например реестра. Для выполнения команды нужно ввести ее в командной строке PowerShell и нажать клавишу ввода. Результат работы команды отобразится сразу под введенной командой.

Рис. 1. Команда Get-ChildItem

Команды для получения справки

В комплект поставки PowerShell входит набор справочных файлов и для начала нужно научимся работать с этими справочными материалами. Чтобы узнать какие команды имеются в PowerShell воспользуемся командой Get-Command. На рисунке 2 показан результат работы этой команды, этого список команд. В этом списке можно увидеть имена команд и их синтаксис, но отсутствует описание того, что делает каждая из команд.

Рис 2. Команда Get-Command

Для получения этих сведений можно воспользоваться командой Get-Help. Если мы введем только Get-Help, то мы получим справку по ней самой.

Рис. 3. Команда Get-Help

Как видно из справки по команде Get-Help, чтобы получить справку по конкретной команде нужно ввести название команды сразу после Get-Help. Посмотрим справку по уже известной нам команде Get-Command. Для этого введем:

Рис. 4. Справка по команде. Команда Get-Help Get-Command

Get-Command в данном случае является параметром команды Get-Help и подобно параметрам команд в командной строке cmd.exe, параметры команд PowerShell предоставляют сведения, необходимые командам для выполнения их работы.

Теперь посмотрим, как все это работает. Обратимся к примеру. Одна из типичных задач системного администратора заключается в том, чтобы читать текстовые файлы. Давайте посмотрим список командлетов начинающихся с Get (Get-Help, Get-Command и т.п.). Для это воспользуемся Get-Help и в качестве параметра укажем Get:

Рис. 5. Команда Get-Help Get

Мы получили список команд начинающихся с Get. Для работы с файлами воспользуемся командой Get-Content. Посмотрим справочную информации о команде Get-Content. Для этого введем:

Рис. 6. Команда Get-Help Get-Content

Как показано на рисунке 6, команда Get-Help Get-Content возвращает описание команды Get-Content и сведения о ее синтаксисе. Из этой справки мы узнали, что команда Get-Content возвращает содержимое элемента, которое в данном случае указывает на любой тип файла в системе. В прошлом администратору, возможно, пришлось бы воспользоваться командой For для работы с пакетными файлами или объектом File-SystemObject в сценарии Windows Script Host (WSH), но в среде PowerShell необходимо просто выполнять команду Get-Content. Чтобы получить более подробную информацию о синтаксисе, нужно добавить к команде параметр -full:

Рис. 7. Команда Get-Help Get-Content -full

Отметим, что параметр -full не основного значения. Параметры этого типа называются параметрами-переключателями, поскольку они как бы переключают линию поведения команд.

На рисунке 7 показана часть сведений, возвращенных этой командой. Администратору нужно будет прокрутить на своем компьютере окно или изменить его размеры так, чтобы можно было просмотреть все содержимое. В разделе ПАРАМЕТРЫ (PARAMETERS англ. версия справки) содержится описание параметров, которые можно добавить к команде, чтобы изменить возвращаемый ею результат. Обратите внимание на два важные пункта у параметров: Требуется? (Required англ.) и Позиция? (Position англ.).

Пункт Требуется? (Required англ.) указывают на то, является данный параметр обязательным или нет. Когда переменная Требуется? (Required англ.) имеет значение true, параметр нужно включать в команду. Если же переменной Требуется? (Required англ.) задано значение false, то данный параметр является не обязательным и его можно не указывать при использовании команды.

Значение Позиция? (Position англ.) позволяет судить о том, нужно ли присваивать параметру имя или на него можно ссылаться по его позиции. Когда переменной Позиция? (Position англ.) присвоено значение named, из этого следует, что при ссылке на данный параметр необходимо указывать его имя. Когда же значение переменной Позиция? (Position англ.) выражено числом, на параметр можно ссылаться по его имени или просто указывать значение параметра в его корректной позиции.

К примеру, как показано на рисунке 8, при выполнении команды Get-Content требуется указывать параметр -Path, рассмотрим этот параметр по подробней.

Рис. 8. Параметр -Path

В переменной Требуется ? стоит значение true , это значит, что этот параметр является обязательным для команды Get-Content. В переменной Позиция? стоит значение 1, это значит, что можно не указывать название параметра при его вводе, нужно лишь ввести его сразу после названия команды (1-ая позиция).

Рис. 9. Команда Get-Content E:01.txt

Где E:01.txt – это параметр -Path

Рис. 10. Файл E:01.txt.

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

В разделе справки ПАРАМЕТРЫ за именем каждого параметра следуют сведения, заключенные в угловые скобки (< >). Эти сведения указывают на тип данных, к которому должно относиться значение параметра. Как показано на рисунке 8, значение параметра -Path должно быть строковым (string). Если за названием типа указаны квадратные скобки (string), это означает, что в качестве значения параметра можно использовать строковый массив. В случае использования параметров-переключателей, таких как например параметр -Full, которые не принимают значений, то тип данных будет указан как .

Рис. 11. Параметр -Full

Следует отметить еще одну функцию PowerShell, имеющую отношение к параметрам, это функция автоматического завершения ввода комбинации «параметр-имя». Пользователь должен только ввести достаточное число букв, составляющих имя параметра, чтобы его можно было отличить от других параметров. Так, команда Get-Help Get-Content -full эквивалентна команде Get-Help Get-Content -ful. В разделе справки ПРИМЕЧАНИЯ также имеются примеры того как можно использовать ту или иную команду. На рисунке 12 показаны 3 примера использования команды Get-Help.

Рис. 12. Примеры использования команды Get-Help

Получение справок по концепциям

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

Рис. 13. Команда Get-Help about*

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

Рис. 14. Команда Get-Help about_aliases

На рисунке 14 показана часть данных справки, которые получены в результате работы команды Get-Help about_aliases. Как мы видим, в файле справки содержится обзор действий, нацеленных на создание псевдонимов в PowerShell и управление ими.

Использование псевдонимов

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

Чтобы просмотреть псевдонимы, доступные в ходе текущего сеанса, нужно запустить команду Get-Alias:

Рис. 15. Команда Get-Alias

Под текущим сеансом подразумевается текущее соединение с процессором PowerShell. При запуске PowerShell пользователь начинает новый сеанс работы; этот сеанс продолжается до тех пор, пока пользователь не закроет PowerShell, прерывая тем самым соединение. В дополнение ко всем встроенным псевдонимам и ассоциированным с ними командам, Get-Alias отображает все псевдонимы, созданные в ходе текущего сеанса, а также псевдонимы, заданные в профилях, которые представляют собой определяемые пользователем настройки конфигурации, загружаемые в PowerShell каждый раз при запуске оболочки.

Если нужно просмотреть псевдонимы, ассоциированные с той или иной командой, точнее определите команду Get-Alias. К примеру, чтобы просмотреть псевдонимы, ассоциированные с Get-ChildItem, выполните команду:

Рис. 16. Команда Get-Alis -definition Get-ChildItem

Как показано на рисунке 16, PowerShell включает три псевдонима для обращения к команде Get-ChildItem, это gci, ls и dir. Вместо имени команды можно использовать любой из них. Таким образом, каждая из четырех следующих команд выдает список содержимого каталога C: :

Рис. 17. Команды Get-ChildItem c: и dir c:

Если мы хотим создать свой собственный псевдоним в PowerShell, то нам поможет команда Set-Alias. Давайте создадим псевдоним для команды Get-Help. Используем сокращение hlp. Нужная нам команда будет выглядеть так:

Рис. 18. Команда Set-Alias hlp Get-Help и созданный псевдоним hlp

После этого всякий раз, когда потребуется вы­пол­нить команду Get-Help, вы можете пользоваться псевдонимом hlp. Этим псевдонимом можно будет пользоваться до завершения сеанса (т.е. до закрытия оболочки PowerShell). Учти­те, что при определении псевдонима возможность включения параметров не предусмотрена, можно использовать толь­ко имя команды. Если же вы хотите определить ссылку на команду и на ее параметры, следует создать специальную функцию.

Заключение

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


Аннотация: Описываются возможности оболочки Windows PowerShell и отличие ее от традиционных оболочек и языков сценариев. Обсуждаются основные концепции PowerShell (типы команд, структура командлетов, псевдонимы команд). Рассматриваются особенности справочной системы PowerShell

Загрузить PowerShell можно с сайта Microsoft, открыв страницу http://microsoft.com/powershell , где имеются ссылки на файл установки последней версии и пакеты документации на разных языках. Запустив загруженный файл, следуйте указаниям мастера установки. В 32-разрядных версиях Windows оболочка PowerShell устанавливается по умолчанию в каталог . В 64-разрядных версиях Windows 32-разрядная версия PowerShell устанавливается в каталог %SystemRoot%\SystemWow64\WindowsPowerShell\v1.0 , а 64-разрядная версия Windows PowerShell устанавливается в каталог %SystemRoot%\System32\WindowsPowerShell\v1.0 .

Типы команд PowerShell

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

Первый тип – так называемые командлеты (cmdlet). Этот термин используется пока только внутри PowerShell. Командлет представляет собой класс.NET, порожденный от базового класса Cmdlet ; разрабатываются командлеты с помощью пакета PowerShell Software Developers Kit (SDK). Единый базовый класс Cmdlet гарантирует совместимый синтаксис всех командлетов, а также автоматизирует анализ параметров командной строки и описание синтаксиса командлетов для встроенной справки.

Данный тип команд компилируется в динамическую библиотеку (DLL) и подгружается к процессу PowerShell во время запуска оболочки (то есть сами по себе командлеты не могут быть запущены как приложения, но в них содержатся исполняемые объекты). Так как компилированный код подгружается к процессу оболочки, данный тип команд выполняется наиболее эффективно. Командлеты – это аналог внутренних команд традиционных оболочек.

Следующий тип команд – функции. Функция – это блок кода на языке PowerShell, имеющий название и находящийся в памяти до завершения текущего сеанса командной оболочки. Функции, как и командлеты, поддерживают именованные параметры. Анализ синтаксиса функции производится один раз при ее объявлении.

Сценарий – это блок кода на языке PowerShell, хранящийся во внешнем файле с расширением ps1. Анализ синтаксиса сценария производится при каждом его запуске.

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

PowerShell 5.0 идет с Windows 10, но для предыдущих ОС новая версия вышла в составе Windows Management Framework 5.0 только в конце февраля, причем со второй попытки . Сегодня я расскажу о некоторых нововведениях, но начну с того, зачем вам может понадобиться PowerShell.

Зачем вам нужен PowerShell

Просто так изучать PowerShell нет смысла, и это верно для любого языка – скриптового, программного и даже человеческого. Как и многие решения Microsoft, PowerShell делается с прицелом на бизнес для автоматизации задач по управлению ПК и серверами в организациях.

В основе скриптового языка лежит мощная программная платформа.NET, поэтому возможности PowerShell простираются намного дальше администрирования.

Как-то раз мне понадобилось удалить один столбец из множества книг Excel 2013. Ручная работа претила, а гугление не давало готового решения. Я создал тему на форуме (да, я тоже иногда задаю вопросы на OSZone:). Мне подходил любой язык, но решение неожиданно для меня оказалось на PowerShell. Как выяснилось, можно загрузить Excel в качестве COM-объекта и манипулировать им дальше.

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

Думаю, идея понятна, и можно уже переходить к новинкам PowerShell 5.0.

8 полезных возможностей

Подсветка синтаксиса

В новой консоли намного легче ориентироваться!

Красный цвет и нумерация строк, однако, из другой оперы .

Поиск по истории в двух направлениях

Сочетания клавиш: Ctrl + R и Ctrl + S
Командлеты: Get-PSReadlineKeyHandler и Set-PSReadlineKeyHandler

Как и в CMD, в PowerShell есть история сессии с навигацией стрелками, a Get-History выводит журнал по аналогии с F7 . Полный список сочетаний клавиш, связанных с журналом, можно вывести так:

Get-PSReadlineKeyHandler | ? {$_.function -like "*hist*"}

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


В отличие от Get-History, содержащей историю текущей сессии, этот журнал ведется глобально и сохраняется при закрытии окна.

Спасибо за наводку Антону Дровосекову и Константину Сидякину из нашей группы ВК .

Создание соединений, символических и жестких ссылок

Командлеты: New-Item , Remove-Item , Get-ChildItem

У меня в блоге хватает рассказов , поэтому я не мог обойти вниманием возможность их создания в PowerShell.

#Символическая ссылка на файл New-Item -ItemType SymbolicLink -Path C:\test\MySymLinkFile.txt -Target C:\test\1.txt #Символическая ссылка на папку New-Item -ItemType SymbolicLink -Path C:\test\MySymLinkFolder -Target C:\Windows\ #Жесткая ссылка на файл New-Item -ItemType HardLink -Path C:\Test\MyHardLinkFile.txt -Target C:\test\1.txt #Соединение New-Item -ItemType Junction -Path C:\Temp\MyJunctionDir -Target C:\Windows

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

Iex "mklink /d C:\test\MySymLinkFolder C:\Windows"

Создание временного файла

Командлет: New-TemporaryFile

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

#Создание временного файла New-TemporaryFile #Создание временного файла и получение его полного пути $tmpfile = (New-TemporaryFile).FullName $tmpfile

Я редко делаю чистую установку основной системы, но на ВМ это происходит регулярно. И OneGet очень удобен для быстрой автоустановки ключевого набора программ.

Примечание. Можно использовать этот модуль, не устанавливая WMF 5.0. Предварительная версия модуля для PS 4.0 и 3.0 доступна отдельно — март 2016 , а более свежие ищите поиском в центре загрузки по запросу PackageManagement PowerShell Modules Preview .

Установка программ

В этом примере из репозитория Chocolatey устанавливаются четыре программы и полный набор утилит . Первые три команды выполняются однократно, причем смену политики надо подтвердить. Четвертая команда тихо устанавливает перечисленные программы, а пятая просто экономит время.

#Разрешить установку подписанных пакетов из Интернета Set-ExecutionPolicy RemoteSigned #Установить поставщик Chocolatey Get-PackageProvider –Name Chocolatey -ForceBootstrap #Сделать Chocolatey доверенным Set-PackageSource -Name Chocolatey -Trusted #Установить программы Install-Package NotepadPlusPlus, vlc, firefox, filezilla, sysinternals -Verbose -Force -ProviderName chocolatey #Добавить путь к исполняемым файлам (sysinternals) в PATH setx PATH "$env:path;C:\Chocolatey\bin" -m

Поставщик скачивает в C:\Chocolatey\lib пакет, в основе которого лежит скрипт chocolateyInstall.ps1. Он загружает установщик программы с официального сайта в папку %temp%\Chocolatey и запускает его в режиме тихой установки. Простейший пример – Notepad++.

Install-ChocolateyPackage "notepadplusplus" "exe" "/S" "https://notepad-plus-plus.org/repository/6.x/6.9/npp.6.9.Installer.exe"

Поиск программ

В репозиториях много программ, все самые популярные точно есть.

Find-Package "*zip*","*commander*" -ProviderName Chocolatey

Удаление программ

С удалением приложений не все так гладко, впрочем.

Uninstall-Package -name filezilla

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

Ссылки по теме OneGet и тихой установки:

  • Пошаговое руководство по установке программ из PowerShell (Дмитрий Буланов)
  • Типы инсталляторов и ключи тихой установки (моя статья 2005 года вполне актуальна:)
  • Сайт автоустановки Windows и форум автоустановки программ

Дискуссия и опрос

Для опытных «скриптовиков» и системных администраторов в PowerShell 5.0 есть и другие интересные возможности (например, классы по аналогии с языками объектно-ориентированного программирования). Полный список вы найдете на этой странице TechNet (ссылка ведет на английскую версию специально, поскольку русская пока не содержит сведений о 5.0).

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

Об авторе

Подсветка синтаксиса в PowerShell 5.0, это установленный по умолчанию модуль PSReadLine. В предыдущих версиях его можно доустановить и прописать его в загрузку в профильном скрипте (переменная $profile) или подгрузить самому, когда нужно

Import-module psreadline

Можно поподробнее про тихую установку из скриптов? Не так давно стал пользоваться chocolatey, очень нравится, особенно обновление всех программ одной командой. Пока не разобрался с тихой установкой, все ставлю в ручном режиме, команда-подтверждение-установка.

6yHTapb

единственное, для чего пока мне понадобился PowerShell в win 10, это обход бага с неработающей кнопкой «свойства» в настройках VPN соединения. Set-VpnConnection -Name «Name» -SplitTunneling $true.
Кстати, Вадим. Есть какая-либо информация по этому поводу? Речь идет о кнопке в свойствах VPN соединения — сеть — IP версии 4 — «свойства». там обычно можно убрать галку «использовать шлюз в удаленной сети». сама кнопка активна, но при нажатии ничего не происходит. тут и помог PowerShell.

Сергей Рощин

Огромное спасибо за Chocolatey
на windows 7 я так понял на работает?

Lecron

По голосованию… Использую почти все варианты. Часть программ в портативном виде. Часть — устанавливается ручками с диска, для тех, которые умеют сами обновлятся или серьезная доработка давно закончена. Из них, часть скриптом. Часть новыми. Часть уже предустановлена в образ.
Опять же, клиенты и задачи бывают разные.

Про PowerShell… Считаю, что Микрософт промахнулся с названием. С первого взгляда, непонятно что получилось. Командная оболочка/процессор или скриптовый язык программирования. Слово Shell наталкивает на первое, но тогда уже давно пора, раз она такая крутая, сделать ее по умолчанию или хотя бы продвигать ее в качестве основной. Но реальные юзкейсы больше наталкивают на второе, замену WSH.

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

    В Win+X можно заменить CMD на PS (свойства панели задач — навигация). И продвигают они в качестве основной давно — на TechNet уже давно ничего нового нет про CMD, только PS.

    Конечно, целевая аудитория — ИТ-специалисты, но то же самое можно сказать про CMD и WSH. Но я не вижу вреда для ЦА своего блога. Я нахожу применение PS дома и на работе, и это не связано с администрированием..

    • Lecron

      Я не про вред. А про непонимание и соответствующие ошибки.
      Что это такое? Чем его видит Микрософт? Командный процессор, работающий, как правило, в интерактивном режиме, который также может

      Работать интерактивно в одном синтаксисе и семантике, а писать последовательности действий в других — нелепо. В этом и есть основная проблема. Такая глубинная, что даже вы ее не замечаете, хотя косвенно упомянули в статье. Синтаксис mklink не проще, а привычнее. Так как New-Item, с единым синтаксисом, позволяет создавать очень очень многое. И вот уже, фактически, его синтаксис проще, чем знание многих отдельных утилит, включая их наименование.

      Обещание сдержали - вот вам модуль для управления менеджерами пакетов, вперед.

      Не понял. Что такое «модуль управления менеджерами»?

        • Lecron

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

          Фича, как обычно, ориентирована на организации, а MSI и MSU поддерживаются в полный рост.

          Lecron

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

          Гм… вот фича — возьмите, попробуйте, разберитесь — это поможет снять некоторые вопросы. Есть поставщик, у него есть пакеты в репозитории. Убрали конкретный пакет? Тогда вы не сможете его скачать у этого поставщика. Но уже скачанный пакет остается локально, им дальше можно управлять.

          Lecron

          Кстати, вот еще вопрос. А есть ли команда Update-Package, а еще лучше Update-AllPackage?

          Привет. Скажи можно ли восстановить boot или bios и как это сделать? Слетел загрузчик виндовс 7 про. В boot изменил уже настройки но винда не хочет загружатся. Ранее была представлена винда 8.1 в сервисе воткнули винду 7 про без моего согласия. Помоги решить проблему!

Алексей

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

поставил массово набор софта уже стоящий на пк. только около 70% нашлось в репозитории.
ключи —y —accept-license —f —x — маны покурил буквально пару минут, может что не понял.
итог:
софт который я не просил: autoIT, autohotkey. зачем?
накатило старую версию Acrobat Reader DC, cheat engine;
не смогло скачать dropbox virtualbox;
тихий режим не сработал viber, wireshark, light alloy — пришлось ставить галочки и жмакать далее;
skype удалило старый, но не поставило новый.
и часть ярлыков не создала, теперь нужно вспоминать какие.

Warnings:
— adobereader
— windjview
— firefox
— notepadplusplus
— teamviewer

тут я не понял что за ошибки.

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

  • Сергей

    PS C:\Users\Gerald> Find-Package "*paint.net*" -ProviderName Chocolatey Name Version Source Summary ---- ------- ------ ------- paint.net 4.0.6 chocolatey Paint.NET is image and photo manipulation software designed to be used on computers tha...

    Буквально сегодня натолкнулся на Хабрахабре в первый раз на упоминание Chocolatey и тут же в Вашей рассылке. Показалось что вот оно! Думал будет потрясающая скриптовая замена автоустановке свободнораспространяемого ПО с ninite.com, но увы. Актуальность софта не поддерживается на паранаидальном уровне, и проблематика есть описанная участниками выше.

    Виталий

    Я считаю, что для консоли лучше подходит философия UNIX:


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

    • Виталий, а что, в Windows входит консольная утилита для ZIP? А делается это для упрощения скриптов на PowerShell, не надо лезть в CMD, интегрированная справка и т.д.

      • Lecron

        А зачем лезть в cmd, если и тот и другой shell, и оба должны самостоятельно запускать исполняемые файлы и управлять их вводом выводом?
        Против включения такого функционала не возражаю, особенно если это сделано по уму, как интерфейс к zlib, а не очередное разбухание кодовой базы — в проводнике одно, в шелле другое, в cmd третье стороннее.

        Виталий

        Нет, не входит.
        Но я и на своём хостинге при первой попытке использовать zip получил что- то типа «zip не установлен. Установите командой apt-get install zip».

        Лезть в cmd? Выше сказали, что PS должен запускать бинарники.

        Справка? В Linux команда man %имя_утилиты% либо %имя_утилиты% -?, первая даёт подробный мануал, вторая как краткая справка по параметрам. Работает кажется везде.

        В итоге командный интерпретатор на Linux- одновременно простая и мощная вещь, есть множество альтернатив, так как в нём самом нет ничего сложного, он просто запускает программы, управляет потоком вывода и интерпретирует простейший синтаксис.

        strafer

        Vadim Sterkin : Виталий, а что, в Windows входит консольная утилита для ZIP?

        Стесняюсь спросить: а не проще было её добавить, чем запиливать встроенный функционал?

  • Herz Mein

    > зачем shell-у, своими средствами работать с архивами

    Если есть такая возможность, заложенная в.Net-классах, то почему бы ее не использовать? Тут просто другой подход, отличный от bash или cmd, которые интерпретаторы командной строки. CLI. А PowerShell скорее отладчик для скриптов, имхо.

    artem

    Lecron Что это такое? Чем его видит Микрософт? Командный процессор, работающий, как правило, в интерактивном режиме, который также может читать команды из файла, который называется скриптом? Или как язык написания скриптов, у которого есть свой REPL? Согласитесь, разница большая?

    Понятно, что задачи разные. Но я не вижу между ними противоречия. Т.е. вполне возможно одним инструментом закрыть обе потребности. К этому и стремится PowerShell. Что-то получается удачно, что-то не очень. Но виденье понятно.

    artem

    Vadim Sterkin :
    И продвигают они в качестве основной давно - на TechNet уже давно ничего нового нет про CMD, только PS.

    Скоро будет, надо полагать. CMD (саму оболочку) сейчас сравнительно активно начали дорабатывать. Хотя до этого лет десять не трогали вообще.

    artem

    Виталий Пишите программы, которые делают что-то одно и делают это хорошо.

    Не вижу противоречий. В PowerShell каждый коммандлет делает что-то одно (за редчайшими исключениями). Кто скажет, что «Expand-Archive» умеет записывать DVD или варить кофе — пусть первый кинет в меня камень.

    Виталий Пишите программы, которые бы работали вместе.

    Здесь PowerShell уделывает все известные мне оболочки, т.к. оперирует объектами, а не текстом. Т.е. «работать вместе» (передавать данные между коммандлетами) получается гораздо эффективнее. Не надо тратить время на парсинг текста и попытку объяснить следующей команде, что же именно представляет собой этот текст.

    Виталий Пишите программы, которые бы поддерживали текстовые потоки, поскольку это универсальный интерфейс.

    Потоки тоже поддерживаются. И если надо передвать именно тест — с этим нет никаких проблем.

    То есть PowerShell вполне следует приведённой философии.

    Виталий Вот например, зачем запихивать в PS «Создание соединений, символических и жестких ссылок» со своим синтаксисом, если есть mklink? Для чего там «Создание и распаковка архивов», если есть zip и его аналоги?

    Да потому что указанные коммандлеты — это и есть «аналог zip». На самом деле, ответить на эту претензию очень легко. Надо только осознать, что коммандлеты — это не встроенные возможности оболочки, а именно что внешние команды. И всё сразу встаёт на свои места. Ведь это нормально, что у нас есть команды для выполнения каких-то действий, правда? Это справедливо как для PowerShell, так и для любой другой оболочки.

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

    • Lecron

      artem : Ведь это нормально, что у нас есть команды для выполнения каких-то действий, правда? Это справедливо как для PowerShell, так и для любой другой оболочки.

      Шелл - как много в этом слове… начало искажаться под воздействием MS.
      Все время считал, что команды не зависят от среды запуска, а встроенные в среду команды, нужны только для обслуживания возможностей самой среды, а не сторонних объектов. Неужели ошибался?
      С этой точки зрения PS начинает напоминать ACDSee и Nero.

      Виталий

      Здесь PowerShell уделывает все известные мне оболочки, т.к. оперирует объектами, а не текстом. Т.е. «работать вместе» (передавать данные между командлетами) получается гораздо эффективнее.

      Сомневаюсь, что все сторонние утилиты поддерживают эти самые объекты. А вот текст поддерживает любая утилита, работающая в командной строке.

      Надо только осознать, что командлеты - это не встроенные возможности оболочки, а именно что внешние команды. И

      Почему тогда у этих командлетов свой синтаксис? Ну никак не похоже, что это внешние команды.

      • artem

        Виталий : Сомневаюсь, что все сторонние утилиты поддерживают эти самые объекты.

        Сторонние утилиты — нет, конечно. А вот сторонние коммандлеты — запросто. Я бы сказал, что процентов восемдесят сторонних коммандлетов достаточно годно работают с объектами.

        Если коммандлета нет и приходится запускать именно утилиту (исполняемый файл), тогда конечно приходится кормить ей на вход текст. Но текст легко получить из объекта (развернув нужное свойство, например). Я понимаю, что это звучит заумно, но после набора критической массы опыта это получается совершенно интуитивно.

        Виталий : Почему тогда у этих командлетов свой синтаксис? Ну никак не похоже, что это внешние команды.

        С этим не могу не согласиться. «Не похоже» — правильное слово:)

        Как я сказал выше, к PowerShell надо привыкнуть. Причём я сейчас скажу гадость в сторону наших евангелистов и MVP, но злоупотребление алиасами (dir вместо Get-ChildItem, md вместо New-Item -ItemType «Directory», знак процента вместо Foreach-Object или вопроса вместо Where-Object и так далее, а также пропуск наименований параметров в случае, когда работает умолчание) только запутывает неподготовленных людей. Из-за этого, в том числе, у меня «привыкание» к PowerShell затянулось на годы. Мне кажется, что если бы все примеры команд, опубликованные в блогах и на форумах, содержали полный синтаксис, то новички испытывали бы гораздо меньше анальной боли.

    На самом деле, использую 2 варианта: разворачивание бэкапа, сделанного сразу после настройки системы либо ставлю собственную сборку Windows 7, куда включаю все нужные настройки и программы.
    А с Win10 менеджер пакетов пока просто ещё не освоил, хотя его наличие вызывает сильный энтузиазм.
    Раньше игрался с разными менеджерами пакетов под Windows, но по тем или иным причинам все были неудобными именно в расчёте «время на освоение»/»время на ручное скачивание». Оказалось проще сделать свою сборку, чем лепить скрипты.

    Евгений Казанцев

    Замечательное начинание, я увидел как установить пачку нужных прог одним скриптом, ninite пользовался, особо не впечатлило, сейчас пользуюсь WPI качанными с торрентов, плюс их в том что там есть много больше и реальная автоустановка, минус что необходимо доверять автору репака.
    Я одного не понял, как этим ОБНОВЛЯТЬ установленные программы полностью автоматически, что является ключевой базовой основной фичей любого пакет менеджера? Как сделать чтобы тот же нотепад++ прописался автоматом приложением по умолчанию без залезания в жутко неудобные «новые, они же современные» настройки? Как работает система зависимостей, и есть ли она там вообще?»

    А если оформить, как скрипт или функцию? Например так (без проверки на существование и без преобразования в полные пути, что необходимо):

    Param ( $create, $extract, $path, $zip) add-type -assembly system.io.compression.filesystem function create-zip ($path, $zip) { ::createfromdirectory($path, $zip) } function extract-zip ($zip, $path) { ::extracttodirectory($zip, $path) } if ($create) { create-zip $path $zip } if ($extract) { extract-zip $zip $path }

    Вызывать соответственно:

    .\test -c -p "C:\Some\Folder" -z "D:\Folder\out.zip" # Для создания.\test -e -p "C:\Some\Folder" -z "D:\Folder\out.zip" # Для извлечения

    • При чем тут оформление? Вы используете классы.NET напрямую в своей функции. Командлет избавляет от нбх обращаться к классам. В этом и разница. Примерно такая же, как между программистом и ИТ-специалистом.

      artem

      Троллейбус из буханки хлеба.jpg

      Я так понимаю, что никто не спорит с тем, что функциями можно сделать вообще всё, что угодно:) Польза же, очевидно, в том, что теперь конкретно для этого действия отдельную функцию писать не нужно. А значит — во-первых, людям будет проще этим пользоваться (особенно если они не умеют писать функции или не могут позволить себе каждый раз их импортировать), а во-вторых будет больше стандартизации. Это несомненное благо. Согласитесь, тупо, когда в пяти скриптах от пяти разных авторов требуется распаковывать архивы, и каждый решает эту задачу немного по-своему. (Например, одно время был популярен вариант через недокументированный com-объект Windows Explorer).

    lesha

    Я работаю на Windows и Mac, а если настраиваю сервер — то Linux. OS X начисто переустанавливал пару раз, но там всё просто — выбрал дату в TimeMachine 10-15 мин и система готова.
    На Windows у меня большинство программ портативные, ставлю только хром ибо иначе не обновляется и пакет программ Adobe, потому с версии СС они качаются через Cretive Cloud. Смысла городить огород с автоматизацией не вижу. PowerShell может и хорош, но мне на Windows нечего автоматизировать, а для Linux и OS X есть bash, которым я уже давно пользуюсь.
    Если друг просит «переустанови мне Винду, а то что-то глючит» ставлю систему с внешнего диска своим «фирменным» способом, а остальное пусть сам себе ставит



  • Загрузка...