Изучение PowerShell — книги и ресурсы. Версии Windows PowerShell

Опытные пользователи операционной системы Windows 10 могли слышать об утилите командной строки PowerShell. Также с ней могут быть знакомы имеющие опыт работы с Windows 7 и 8.1. После многих лет использования приложения командной строки Windows и файлов формата.bat пришло время познакомиться с более функциональным инструментом.

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

Шаг 1: установка

Для начала нам необходима сама утилита PowerShell. Если вы работаете с Windows 10, у вас уже установлена версия PowerShell 5. Обновление Windows 10 Anniversary Update использует версию 5.1, но разница незаметна. В Windows 8 и 8.1 применяется PowerShell 4, чего тоже вполне достаточно. Установка PowerShell на Windows 7 не доставит проблем, но всё же пару лишних шагов придется сделать. В частности, нужно дополнительно установить.Net Framework. Можно установить Windows Management Framework, в состав которого входит PowerShell.

У PowerShell есть два интерфейса. Опытные пользователи могут выбрать полноценный графический интерфейс, известный как Integrated Scripting Environment (ISE). Новичкам лучше использовать консоль PowerShell, простой текстовый интерфейс в стиле командной строки Windows или даже DOS 3.2.

Для запуска PowerShell от имени администратора в Windows 10 нажмите на кнопку «Пуск» и прокрутите список приложений до Windows PowerShell. В Windows 8.1 ищите Windows PowerShell в папке System в Windows. В Windows 7 оболочка располагается в папке Accessories. В качестве обычного пользователя PowerShell можно запустить точно так же, используя левую кнопку мыши вместо правой.

В любой версии Windows можно применить поиск. Для удобства дальнейшего использования можно закрепить PowerShell на панели задач.

Шаг 2: старые команды Windows

Синтаксис команд Windows в PowerShell работает привычным образом. Например, cd меняет папки, dir показывает список всех файлов и папок внутри текущей папки.

В зависимости от метода запуска консоли PowerShell можно начать в c:\Windows\system32 или в c:\Users\ . В примере на скриншоте используется команда cd .. (с пробелом) для перехода на один уровень вверх за раз, затем запускается команда dir для отображения списка файлов и папок в директории C:\ .

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

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

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

Команда 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 .

Шаг 4: получение помощи по параметрам

На скриншоте вы могли заметить два списка под SYNTAX для get-childitem . Наличие двух разных синтаксисов означает возможность применения двух способов запуска командлет. Как держать синтаксис отдельно друг от друга и что означают параметры? Ответ простой, если знать трюк.

Для получения подробностей относительно параметров командлеты get-childitem или любой другой используйте параметр -full :

get-help get-childitem -full

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

Просмотр описания параметров позволяет заметить, что get-childitem даёт возможность получить объект child (вроде названия подпапки или имени файла) в указанном месте, с совпадением определённых символов или без. Например:

get-childItem “*.txt” -recurse

возвращает список файлов «*.txt» в текущей папке и всех подпапках (из-за параметра -recurse ). Тогда как

get-childitem “HKLM:\Software”

возвращает список всех ключей реестра верхнего уровня в HKEY_LOCAL_MACHINE\Software .

Если вы когда-нибудь пытались попасть в реестр при помощи командной строки Windows или файлов.bat, вы сможете оценить функциональность этого варианта доступа.

Шаг 5: изучение имён

Есть причина того, почему показанные до сих пор командлеты выглядят сходным образом: get-childitem, update-help, get-help используют единую схему глагол-существительное. Это соглашение применяют все командлеты PowerShell, в них глагол стоит перед единственным существительным. Это понравится тем, кто в своё время пострадал от непостоянства названий команд в языках VB и VBA.

Взгляните на самые распространенные командлеты:

set-location : устанавливает текущую рабочий локацию на определённую локацию

get-content : получает содержимое файла

get-item : получает файлы и папки

copy-item : копирует объект из одной локации в другую

remove-item : удаляет файлы и папки

: получает процессы, запущенные на локальном или удаленном компьютере

get-service : получает сервисы, запущенные на локальном или удаленном компьютере

invoke-webrequest : получает содержимое с веб-страницы в интернете

Для просмотра работы определённой командлеты используйте get-help как в случае

get-help copy-item -full

На основе описания в помощи можно понять, что необходимо командлете. Например, если вы хотите копировать все файлы и папки из Documents в c:\temp , используйте

copy-item c:\users\ \documents\* c:\temp

Введя эту команду, вы увидите несколько интересных возможностей окружения PowerShell. Например, если набрать copy-i и нажать кнопку Tab, PowerShell заполнит Copy-Item . Если неправильно набрать командлету и PowerShell не может распознать её, даётся полное описание того, что было сделано не так.

Попробуйте данную командлету:

invoke-webrequest askwoody.com

Вы получите краткий список заголовков, изображений, ссылок и прочего содержимого веб-страницы. Обратите внимание в get-help на список invoke-webrequest , который «возвращает коллекцию форм, ссылок, изображений и прочие важные элементы HTML» — именно то, что должно показываться на экране.

Некоторые командлеты помогают управлять самим PowerShell:

get-command : список всех доступных командлет

get-verb : список всех доступных глаголов

clear-host : очистка экрана программы-хоста

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

get-command *-service

Будут показаны все глаголы, доступные с существительным service . Вот их список:

Get-Service

New-Service

Restart-Service

Resume-Service

Set-Service

Start-Service

Stop-Service

Suspend-Service

Можно объединять эти командлеты с другими.

Шаг 6: использование труб

Если вы знакомы с командной строкой Windows или пакетными файлами, то знаете о перенаправлении и трубах. Перенаправление (символ >) и трубы (символ |) берут результат действия и прикрепляют его в другое место. Например, можно перенаправить результат команды dir в текстовый файл или передать результат команды ping в команду find для фильтрования интересных результатов, вроде

dir > temp.txt

ping askwoody.com | find “packets” > temp2.txt

Здесь во второй команде find ищет строку packets , взятую из адреса askwoody.com командой ping и объединяет все совпадающие строки в файл под названием temp2.txt .

Первая из этих команд отлично работает в PowerShell. Для запуска второй команды потребуется нечто вроде

ping askwoody.com | select-string packets | out-file temp2.txt

Использования перенаправления и труб значительно расширяет возможности командной строки Windows: вместо бесконечного прокручивания вниз по экрану в поиске текстовой строки можно отфильтровывать нужные команды Windows.

Powershell обладает поддержкой pipe , причём она не ограничена текстом. PowerShell позволяет передавать целый объект из одной командлеты в другую, где объект представляет собой комбинацию данных (называемых свойствами) и действий (методов), которые могут использовать эти данные.

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

Как это понять? Используйте командлету get-member . Если вы хотите знать, какой тип объекта обрабатывает командлета, проведите её через get-member . Например, если вы пытаетесь понять запущенные на компьютере процессы и сузили опции до командлеты , вот как узнать результат командлеты:

get-process | get-member

Запуск этой командлеты выдаёт длинный список свойств и методов для , но в самом начале списка можно увидеть тип объекта, который создает :

TypeName: System.Diagnostics.Process

Нижеприведенный скриншот также показывает свойства под названием get-process Handles, Name, NPM, PM, SI, VM и WS .

Если вы хотите манипулировать результатом для работы с этим командлетом (вместо отображения длинного списка активных процессов на мониторе), нужно найти другую команду, которая в качестве вводных данных принимает System.Diagnostics.Process . Для поиска нужной командлеты снова используйте возможности PowerShell:

get-command -Parametertype System.Diagnostics.Process

Эта командлета выдает список командлет, которые могут обрабатывать System.Diagnostics.Process .

Некоторые командлеты известны тем, что принимают почти любой вид данных. Главной среди них является . Эта командлета пропускает через себя каждый посылаемый по трубе объект, один за одним, и применяет к нему заданной критерии выбора. Существует специальный маркер под названием $_ , который позволяет использовать каждый предмет в трубе, один за раз.

Допустим, вы хотите получить список всех запущенных на компьютере процессов с названием «svchost», то есть хотите сопоставить свойство Name процессу svchost . Используйте команду:

get-process | where-object {$_.Name -eq “svchost”}

Командлета смотрит на каждый объект System.Diagnostics.Process , сравнивает .Name этого объекта с «svchost»; если есть совпадения, они выдаются на монитор. Смотрите на скриншот.

Шаг 7: анализ полезных команд PowerShell

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

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

Get-AppXPackage | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

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

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

Командлета Get-AppXPackage возвращает объект TypeName Microsoft.Windows.Appx.PackageManager.Commands.AppxPackage , который включает в себя полное имя пакета приложения и местонахождения соответствующего файла манифеста XML. Если запустить командлету get-appxpackage , вы увидите длинный список пакетов приложений. Скриншот показывает описание приложения Xbox.

Командлета Foreach посредством цикла проходит через каждый объект в AppXPackage , отправляя их командлету Add-AppxPackage . Согласно get-help для Add-AppxPackage , тут есть два ключевых переключателя:

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

Строка «$($_.InstallLocation)\AppXManifest.x ml» описывает, где расположен файл manifest.xml . Если посмотреть на файлы AppXManifest.xml , вы увидите сложный список идентификаторов приложений, исполняемых файлов и большое количество визуальных элементов, связанных с приложением.

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

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

Краткая справка

PowerShell был официально запущен в 2006 году и был призван заменить сильно ограниченный интерпретатор командной строки cmd. Это уже была вторая попытка замены, выпущенный 8 годами ранее Windows Script Host провалился из-за отсутствия встроенной документации и отсутствия интеграции в оболочку.

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

Командлеты на конвейере

Основа PowerShell - командлеты. Если вы хоть немного знаете английский язык, то уже поняли, что название «командлеты» происходят от красноречивого «cmdlet». Их структура включает в себя собственно команду (глагол) и объект (существительное). Например: Get-Process, Sort-Object, Rename-Item и так далее. Разделение, как видно, выполняется знаком «-». Есть ограниченный список командлетов, используемый системой по умолчанию, но начиная с версии PowerShell 2.0 вы можете самостоятельно создавать свои командлеты. Подробнее прочитать об этой процедуре вы можете на официальной странице Microsoft. Кстати, актуальная версия 5.1 вышла в августе прошлого года.

Другое базисное понятие в PowerShell - конвейер (Pipeline). Конвейер - процедура передачи выходных данных одного командлета в качестве входных следующего. Обозначается конвейер «|» , а на практике такая запись выглядит предельно просто:

Get-Process | Sort CM

Как видно из записи, в коде в конце каждой строки ставить «;» не надо, но данный знак можно использовать для разделения командлетов:

Get-Process; Get-Help

Все удобно и красиво.

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

Удобство и скорость

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

$proc = "Wrong_Proc"
$strCategory = "computer"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.Filter = ("(objectCategory=$strCategory)")
$colProplist = "name"
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
$colResults = $objSearcher.FindAll()

Foreach ($objResult in $colResults)
{
$objComputer = $objResult.Properties
$objComputer.name
if (Test-Connection -Count 2 -ComputerName $objComputer.name -Quiet)
{
$ps = Get-WmiObject Win32_Process -Filter "Name="$proc"" -ComputerName $objComputer.name

Foreach ($i in $ps)
{
$result = $i.Terminate()
if ($result.ReturnValue -eq 0) { "Success $comp"}
else {"Error $comp"}
}
}
}

Wromg_Proc - название искомого процесса, например, wmplayer.exe. Первая часть скрипта посвящена поиску нашего компьютера, вторая в AD, вторая - собственно работе с процессом. Несмотря на то, что визуально такая запись может оттолкнуть новичка, фактически со знанием английского можно легко расшифровать код.

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

Заверните со списком литературы

Не знаю, заинтересовались ли вы 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. Анализ синтаксиса сценария производится при каждом его запуске.

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

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.


29.10.2012 Дон Джоунз

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

Дон Джоунз ([email protected]) - технический инструктор по PowerShell (www.windowsitpro.com/go/DonJonesPowerShell), имеет звание Microsoft MVP

PowerShell - оболочка командной строки.

Команды PowerShell выполняются в конвейере.

Среда PowerShell может быть расширена, что позволяет применять различные технологии.

Освоив PowerShell, вы станете более квалифицированным администратором.

Почему PowerShell?

Первым делом стоит развеять два важных мифа, касающиеся PowerShell. Миф первый: PowerShell - это язык сценариев. Неправда. PowerShell действительно содержит язык сценариев; это очень компактный язык, в состав которого входит всего лишь порядка двух десятков ключевых слов. Но на самом деле PowerShell - это оболочка командной строки, во многом сходная с cmd.exe или с оболочкой UNIX Bash. В этой оболочке выполняются команды - такие, как Ipconfig, Ping и другие команды, каковыми вы, несомненно, пользовались. Вполне возможно, на каком-то этапе у вас возникнет желание объединить несколько команд в пакетный файл, и вы имеете полное право назвать такой файл сценарием. Но составление подобных файлов нельзя считать программированием в том смысле, в котором программированием именуется разработка программ с помощью продуктов Microsoft Visual Studio.

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

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

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

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

Выполнение команд

Не следует полагать, что работа с PowerShell всегда связана с трудностями. Представьте, к примеру, что вам нужно добавить в Active Directory (AD) учетную запись нового пользователя. Задача решается довольно просто:

New-ADUser -Name DonJ -samAccountName DonJ -Title CTO -City «Las Vegas» -Department IT

Как видите, команда New-ADUser принимает несколько параметров командной строки. Эти параметры (-Name, -Title, -City и т.д.) соответствуют полям, с которыми вам пришлось бы иметь дело в случае добавления пользователя с помощью оснастки Active Directory Users and Computers. Так почему же нам предлагается работать не с графическим интерфейсом, а с командной строкой? Потому что командная строка облегчает процесс решения нескольких задач в ходе одной операции.

Допустим, вы получили электронную таблицу Microsoft Excel со списком новых пользователей, которым требуются учетные записи. В первой строке этой электронной таблицы содержатся заголовки столбцов: City, Title, Department, Name и samAccountName - атрибуты этих пользователей. Сохраните данный файл Excel в виде файла значений с разделителями-запятыми (файл CSV). Можете назвать его NewUsers.csv. Теперь вы сможете задействовать PowerShell для создания новых пользователей:

Import-CSV NewUsers.csv | New-ADUser

Нетрудно убедиться, что таким образом задача решается намного быстрее, чем в случае создания пользователей средствами графического интерфейса. PowerShell дает возможность создать 100 пользовательских учетных записей всего лишь за несколько секунд, тогда как на формирование такого количества учетных записей с помощью графического интерфейса пользователя может уйти несколько часов. Кстати, New-ADUser - это команда из модуля Microsoft ActiveDirectory; ее можно найти в комплекте Remote Server Administration Tools for Windows 7, а также в контроллерах доменов Windows Server 2008 R2 (и более поздних). Для загрузки модуля в память (после установки его в системе) нужно будет выполнить команду

Import-Module ActiveDirectory

Изучаем синтаксис

Самая трудная задача в ходе освоения любого интерфейса командной строки, command-line interface (CLI), - это изучение синтаксиса команд. Какие параметры нужно использовать? Как каждый из этих параметров влияет на выполнение команды и какие значения он принимает? Нередко администраторы часами выискивают примеры использования синтаксических конструкций с помощью поисковых программ. Но в среде PowerShell подобные проблемы решаются гораздо проще. Вам нужно выполнить некую операцию с той или иной службой?

Help *service*

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

Help Set-Service -full

Здесь важен параметр -full. Этот параметр позволяет получить массу дополнительной информации, включая подробные инструкции по применению каждого параметра, а также практические примеры. Вам нет нужды искать примеры с помощью поисковой системы Bing; они уже заложены в продукт.

Отметим, что некоторые пользователи вместо короткой команды Help используют более строгий вариант Get-Help. Я предпочитаю первое; в этом случае после отображения каждого экрана текста автоматически вставляется пауза. Использование формата Help избавляет вас от необходимости неоднократно нажимать кнопку More для продолжения знакомства с синтаксисом команды.

Кое-что о «подводных камнях»

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

Get-Process | Sort -Property VM -Descending | Select -First 10

На экране появляется то, что выдала последняя команда конвейера. Если на выходе последней команды ничего нет, экран остается пустым. А теперь выполните команду в таком формате:

Get-Process | Sort -Property VM -Descending | Select -First 10 | Export-CSV procs.csv

Команда Export-CSV не генерирует выходные данные, поэтому на экране ничего не отображается. Зато на диске появляется файл CSV, а это уже большое дело.

Кроме того, имейте в виду, что когда на экране все-таки появляется некий текст, его внешний вид определяется применяемыми по умолчанию настройками PowerShell. Эти настройки вы можете изменять:

Get-Process | Sort -Property VM -Descending | Select -First 10 | Format-Table -Property ID,VM,PM,Name -autoSize

Однако четыре команды категории Format - Format-List, Format-Table, Format-Wideи Format-Custom - не генерируют традиционные выходные данные. Они формируют инструкции, в соответствии с которыми будет форматироваться содержимое экрана. Следовательно, команда, подобная приведенной ниже, не будет функционировать так, как можно было бы ожидать:

Get-Process | Sort -Property VM -Descending | Select -First 10 | Format-Table -Property ID,VM,PM,Name -autoSize | ConvertTo-HTML | Out-File procs.html

В роли входных данных для команды ConvertTo-HTML выступают инструкции по компоновке экрана, поэтому мы получим файл HTML, состоящий из этих инструкций. Последние же по большей части состоят из шестнадцатеричных кодов и мусора; во всяком случае, такими они представляются пользователю. Но эту западню легко обойти: достаточно воздерживаться от использования каких-либо команд после команды Format. Исключение можно сделать для команд Out-Printer и Out-File; обе они созданы специально для того, чтобы помочь пользователю разобраться в инструкциях по компоновке экрана.

Расширение оболочки

Подобно консоли управления Microsoft Management Console (MMC), оболочка PowerShell предусматривает возможность расширения, что позволяет применять в ней различные технологии. Как следует из таблицы, расширить оболочку можно двумя способами; выбор зависит от того, используете вы PowerShell версии 1 (v1) или версии 2 (v2). Оба метода обеспечивают возможность определять, какие расширения установлены в системе локально.

Следует отметить, что метод поиска PowerShell v2 отыскивает лишь модули, установленные там, где им положено находиться; между тем, некоторые расширения продуктов размещают свои модули, скажем так, в неположенных местах. Однако эти продукты обычно создают ярлыки меню Start, которые указывают пользователю на место установки соответствующего модуля.

Некоторым пользователям досадно, что созданы некие версии PowerShell, предназначенные для взаимодействия с определенным продуктом, такие, как Exchange Management Shell или SharePoint Management Shell. На самом же деле никаких «особых» версий, ориентированных на взаимодействие с другими пакетами, не существует. Просто разработчики Microsoft дали некоторым функциям PowerShell имена, наталкивающие на ошибочный вывод. Пример - Exchange Management Shell. Это не более чем экранный ярлык меню Start. Просмотрите его свойства, и вы увидите, что данный ярлык всего лишь запускает на выполнение всем известный файл PowerShell.exe. Точнее говоря, он одновременно запускает программу PowerShell и выполняет в автоматическом режиме тот или иной сценарий либо загружает тот или иной модуль. Соответствующий модуль вы можете загрузить вручную. Загляните в свойства рассматриваемого ярлыка меню Start, определите, где расположен интересующий вас модуль, и запустите команду

Get-Module path-to-module

Таким образом, вы сможете загрузить в оболочку хоть все имеющиеся модули.

Объекты

Специалисты отрасли так много говорят об объектах в среде PowerShell, что некоторых это просто выводит из себя. Им тут же приходят в голову такие, скажем, мысли: «Это уже похоже на разработку, а я программистом не нанимался. Так что давайте как-нибудь без меня!».

Успокойтесь, коллеги. «Объект» - это всего лишь слово, и означает оно «структура данных». Представьте себе электронную таблицу Excel или даже таблицу базы данных Microsoft Access. Каждая строка в таблице или в электронной таблице представляет собой объект, а каждый столбец - свойство. Вот и все, ничего сложного. Команда

Get-Service

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

Например, удалять объекты, на которые вы не хотите смотреть. Или, используя команду Where-Object в качестве фильтра, убирать из конвейера те или иные элементы. Рассмотрим для примера такую команду:

Get-Service | Where { $_.Status -eq "Running" }

Она отображает список служб - но только тех, что выполняются в данный момент. Синтаксис запутанный, однако он поддается анализу. Внутри фигурных скобок (где перечисляются критерии объектов, которые вы хотите увидеть) содержится комбинация символов $_; это выходные данные предыдущей команды. Я не хотел просматривать весь объект service; мне нужно было поработать только с частью этого объекта. А как мы обозначаем часть или дробь в математике? Точкой, отделяющей дробь от целого (как в выражении «3.147», верно? Поэтому я поставил после символов $_ такую точку, а затем указал дробь, с которой мне нужно было поработать: Status. Из предшествующего опыта работы с командой Get-Service мне известно, что если в ячейке столбца Status указывается значение Running, речь идет о выполняемых в данный момент службах. Поэтому я указал, что мне требуются лишь те службы, значение которых, заданное в столбце Status, равно (equals, или с использованием оператора сравнения -eq) Running. Если вы хотите получить об операторах сравнения более подробную информацию, выполните команду

Help about_comparison_operators

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

Get-Service | Select -Property Name,Status

Изменяйте порядок сортировки. По умолчанию сортировка всегда осуществляется в порядке возрастания. При необходимости измените порядок на обратный:

Get-Service | Sort -Property Name -Descending

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

Get-Service | Sort -Property Status | Select -Property Name,Status

Интернет - не последняя инстанция

Одна из проблем, связанных с Интернетом, состоит в том, что право голоса в Сети может получить любой человек. Разработчики среды PowerShell позаботились о том, чтобы она была доступна самым разным категориям пользователей. И если вы обнаружили образец сценария объемом около 900 строк кода, из этого отнюдь не следует, что подобный «программистский» подход составляет единственный способ применения PowerShell. Данный сценарий показывает лишь, каким образом один из многих пользователей решил применить этот продукт - возможно, кстати, потому, что данный подход понятен этому человеку лучше всех прочих.

На сайте http://ShellHub.com я представил краткий перечень ресурсов PowerShell, авторы которых отстаивают не «программистский» подход, а более органичный для администраторов подход, предполагающий введение команды с клавиатуры с последующим нажатием клавиши ввода. Со временем вы наверняка начнете модифицировать свой метод работы, и он будет становиться все более сложным. И это замечательно. Но вы можете начать с простых вещей и добиваться превосходных результатов. Приведу такой пример. В книге Windows PowerShell Scripting and Toolmaking я начинаю с разъяснения простой команды, которую вы можете ввести с клавиатуры и немедленно получить результат. Постепенно я раскрываю все возможности этой команды: ввожу дополнительные параметры, привлекаю справочные материалы и т.д. - и наконец, одолев еще 100 страниц печатного текста, читатель воспринимает рассматриваемую команду как собственную команду PowerShell. Нет никакой нужды использовать оболочку PowerShell сразу во всей ее сложности. Начните с самого простого и постепенно беритесь за все более сложные задачи.

Не нужно начинать все с начала

На занятиях, посвященных среде PowerShell, я часто задаю своим студентам вопрос: «Как в PowerShell подключается сетевой диск?». В попытке найти ответ на этот вопрос многие обращаются к справочной системе. В ходе поисков студенты часто останавливают свой выбор на New-PSDrive, что, кстати, не является правильным ответом; эти накопители не видны за пределами PowerShell. В конце концов я объявляю им правильный ответ: Net Use.

Присутствующим остается лишь сокрушаться: «Ну почему это не пришло мне в голову?». Что ж, студенты получили хороший урок: Microsoft не предлагает нам забыть все, что мы уже знаем. Странно, правда? Все известные нам по окну командной строки приемы - Net Use, Icacls, DsAcls, NSLookup, Ping, Ipconfig, Pathping - по-прежнему функционируют, так что продолжайте с ними работать. Более того, эти средства можно свободно использовать совместно с собственными командами PowerShell. Так что если вы уже знаете, как решается та или иная задача, не ломайте голову над тем, как это делается в среде PowerShell. Смело применяйте известные вам приемы.

Почему некоторые администраторы не решаются приступать к изучению PowerShell?

Я открою вам маленький секрет. Многие администраторы стали администраторами Windows (а не администраторами UNIX или других систем) потому, что с Windows работать проще, по крайней мере, на первый взгляд. Запустите парочку мастеров, нажмите две-три кнопки - и ваша работа сделана. Многие из таких администраторов, в сущности, очень слабо представляют, какие именно процессы скрывают от нас эти кнопки и мастера. Вот почему перспектива освоения PowerShell пугает их. Дело не в том, что таким администраторам страшно браться за изучение синтаксиса, и не в том, что они считают нудным делом ввод данных с клавиатуры. А дело в том, что, работая с графическим интерфейсом, эти администраторы привыкли, что их, что называется, буквально «водят за ручку», тогда как PowerShell явно нарушает эту традицию.

Умение эффективно работать с PowerShell предполагает четкое понимание процессов, протекающих в системах, которыми вы управляете. Навыки применения PowerShell - признак первоклассного, знающего администратора. К сожалению, за годы, когда внутренние механизмы системы были скрыты от нас графическим интерфейсом, многие из наших коллег утратили часть знаний, которыми они должны владеть. Мне приходилось беседовать с администраторами, которые никогда не пользовались утилитой проверки связи Ping, которые без оснащенного графическим интерфейсом инструмента не могут отыскать причины неполадок в механизме репликации AD и которые имеют весьма слабое представление о том, как почтовые сообщения выстраиваются в очередь и доставляются в системе Exchange. Таким администраторам трудно овладеть навыками работы с PowerShell.

А вот вопрос для вас, уважаемые читатели. Скажите, можете ли вы создать пользовательскую учетную запись AD с незаполненным именем входа? Ответ: да, но только одну. Разумеется, применивший эту учетную запись пользователь не сможет зарегистрироваться в системе, но, с другой стороны, единственное требование к имени входа со стороны AD состоит в том, чтобы это имя было уникальным. Незаполненное имя уникально в первый раз, когда вы его используете; и только попытка создать второго пользователя с незаполненным именем приведет к сбою. Разумеется, если вам доводилось обращаться к AD только через графическую консоль, вам это обстоятельство неизвестно, поскольку графическая консоль вообще не принимает «незаполненных» имен. Но если внутренние механизмы AD известны вам досконально, ответ будет вполне очевиден.

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

Учитесь - или ищите другую работу

Я люблю повторять слова, которые стали моей присказкой: «Изучайте PowerShell или учитесь произносить фразу: "А чипсы будете заказывать?"». Я уже сегодня вижу, как в различных организациях администраторов, не способных работать с PowerShell, задвигают на вторые роли. И действительно, если владение технологией PowerShell - признак квалифицированного, знающего администратора, почему не сохранять и не продвигать таких сотрудников, избавляясь от их менее осведомленных коллег? Опыт и знания в области PowerShell - более надежный показатель высокой квалификации, нежели любой сертификационный экзамен, устроенный специалистами Microsoft. Если вы полагаете, что получили свою работу в первую очередь благодаря сертификатам, уж будьте уверены: знание PowerShell еще важнее.

На эту ситуацию можно взглянуть и под другим углом. Если вы ценны для своей компании только тем, что способны нажимать на кнопки Next, Next, Finish и при этом не понимаете, что происходит «под капотом» и как можно автоматизировать задачу, чтобы она выполнялась быстрее и эффективнее... Ну, тогда вы относитесь к той категории работников, которых я называю «обезьяна у кнопки». Иными словами, заменить вас можно, что называется, в два счета. Что касается меня, я предпочитаю быть специалистом, обладающим доступными только для посвященных знаниями о том, как автоматизировать работу. Это избавляет меня от необходимости выполнять скучные повторяющиеся операции. А, кроме того, такого сотрудника будет не так-то просто уволить.