Intro

PowerShell: Вступление

Windows PowerShell — это новая оболочка командной строки на основе задач и язык сценариев. Она специально разработана для администрирования систем. Встроенная в .NET Framework, оболочка Windows PowerShell помогает ИТ-специалистам и опытным пользователям контролировать и автоматизировать процесс администрирования операционной системы Windows и приложений, работающих в системе Windows.

Возможности стандартного командного интерпретатора cmd в Windows довольно скудны, особенно по сравнению с командными интерпретаторами Unix: ksh, bash, zsh. В Microsoft это тоже поняли и разработали новую оболочку. Вначале она имела кодовое имя Monad, она же MSH, которая впоследствии была переименована в Windows PowerShell.

Используя оболочку Windows PowerShell, администраторы могут управлять системами с помощью отдельных команд или сценариев, автоматизирующих задачи управления. Exchange Server 2007, System Center Operations Manager 2007, System Center Data Protection Manager V2 и System Center Virtual Machine Manager используют оболочку Windows PowerShell для повышения эффективности и производительности.

Если вы раньше не слышали о PowerShell – представьте, что командную строку Windows (cmd.exe) и интегрировали с VBScript, сделав её лёгкой в употреблении и позволяющей вам автоматизировать и контролировать задачи по администрированию системы.

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

Технология PowerShell постепенно завоевывает сердца админов, привыкших расходовать время с пользой. Действительно, зачем постоянно тратить время на выполнение одной и той же операции, если ее можно автоматизировать? На PS это сделать легко. К счастью, программирование на PowerShell не сравнить с аналогичной разработкой под bash, а значит, освоить данную вещь сможет даже начинающий программист.

В Windows 7 PowerShell обзавелся графической средой разработки. Программировать сценарии стало еще проще и понятней. Среда обладает всеми необходимыми средствами для комфортной разработки (Отладчик, подсветка синтаксиса и т.д.), что делает процесс разработки схожим с созданием приложения в таких средах как Visual Studio.

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

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

Появилась поддержка транзакций.

Стало возможно разбивать разрабатываемые сценарии на отдельные составляющие - модули. Таким образом, появляется возможность многократного использования кода.


Quick Start

Быстрый старт

Чтобы запустить PowerShell, наберите в окне поиска меню кнопки Пуск powershell. Выберите пункт Windows PowerShell и нажмите Enter.

У вас запустится оболочка PowerShell, очень похожая на оболочку коммандной строки (cmd.exe), но имеет синий фон экран.

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

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

  • Get-Command - получить список доступных команд;
  • Get-Help - получить справку по указанной команде;
  • Get-Drive - получить список дисков;
  • Set-Location - изменить текущее местоположение (аналог команды cd в cmd);
  • Set-Alias - создать псевдоним для команды;
  • Get-Date - вывести дату.

Как и в cmd.exe, поддерживается перенаправление ввода/вывода, например:

Get-Date > current-date.txt

Работа с текстом

  • Выделите нужный текст с помощью мыши.
  • Нажмите на правую кнопку мыши - произойдет копирование текста в буфер обмена.
  • Поместите курсор в нужное место.
  • Нажмите правую кнопку мыши - произойдет вставка текста из буфера обмена.

Команды для работы с файловой системой

  • type - просмотр файла;
  • more - постраничный вывод файла;
  • copy - копирование одного или нескольких файлов;
  • move - перемещение одного или нескольких файлов (или переименование каталога);
  • del - удаление одного или нескольких файлов;
  • ren - переименование файла;
  • attrib - изменение атрибутов файла/каталога (скрытый, системный, только чтение, архивный);
  • fc - сравнение файлов;
  • find - поиск текстовой строки в одном или нескольких файлах;
  • grep - поиск текстовой строки (можно использовать регулярные выражения) в файле или в списке файлов;
  • cd - смена каталога;
  • dir - вывод содержимого каталога;
  • tree - вывод дерева каталогов;
  • md (или mkdir) - создание каталога;
  • rd - удаление каталога или дерева каталогов.

Автоматическое завершение ввода команды

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

С помощью клавиши «Стрелка вверх» можно вызвать последнюю использованную команду, а с помощью клавиши «Home» переместить курсор в начало строки, а затем ввести данные. Вывести содержимое переменной можно, просто напечатав в командной строке $P.

Прерывание вывода информации

Если на экран выводится много информацию, и вам необходимо прервать эту операцию, то вывод можно прервать комбинацией клавиш CTRL+C.

Переменные

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

$a = get-process | sort-object -descending

Тип переменной выбирается автоматически, но можно установить любой тип .NET: array, bool, byte, char, char[], decimal, double, float, int, int[], long, long[], regex, single, scriptblock, string, type, xml. Он определяется в квадратных скобках в момент присваивания:

$var = [int]10;

В сценариях можно использовать условные операторы if-elseif-else, switch, а также операторы циклов while, do-while, do-until, foreach.


PowerShell ISE

После удачного выпуска консольной программы PowerShell, разработчики Microsoft сделали графическую консоль/редактор, который называется PowerShell ISE (Integrated Scripting Environment).

PowerShell ISE является полноценным редактором с подсветкой кода, закладками, и возможностью выполнения интерактивных команд. Это крайне удобно при написании сценариев: можно легко протестировать команду, и затем добавить её в основной код. Или наоборот выполнить несколько строк выделенных в открытом файле.

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

Еще в ISE встроен отличный отладчик. Вы можете расставлять брейкпойнты (F9), запускать пошаговое выполнение, просматривать содержимое переменных наводя на них курсор, и т.д.

В PowerShell ISE доступен специальный объект, $PsISE, с помощью которого можно управлять интерфейсом утилиты, и даже расширять его, например добавляя свои собственные элементы меню.

Так как ISE создавался с нуля, для PowerShell, он не страдает болезнями доставшимися PowerShell.exe от консольной подсистемы Windows. Так например он изначально, полностью, стопроцентно поддерживает Unicode, и в нем можно легко менять шрифты, и их размер.

Источник: http://xaegr.wordpress.com/2009/04/26/powershell-ise/


Cmdlets

Cmdlets (произносится как commandlets) основаны на синтаксе типа глагол-существительное в ед.ч. Команды записываются на английском языке, например, get-service, get-process, stop-service, get-wmiobject.

Get-Help вызывает интерактивную справку по синтаксису Windows PowerShell.

Get-Help - выводит на экран справку об использовании справки
Get-Help * - перечисляет все команды Windows PowerShell
Get-Help команда - выводит справку по соответствующей команде
Get-Help команда -Detailed - выводит подробную справку с примерами команды

В Windows PowerShell также включены псевдонимы многих известных команд. Например, команды help (классический стиль Windows) и man (классический стиль Unix) работают так же, как и Get-Help.

Чтобы увидеть весь список, состоящий, из более чем 130 предустановленных cmdlets, наберите в командной строке

get-command

Например, чтобы увидеть все сервисы наберите:

get-service

Мощные групповые символы и объекты для манипулирования

Чтобы увидеть все процессы, которые начинаются с буквы «w», и все зависящие от них, нужно просто набрать

get-service w* | format-list DisplayName, DependentServices

Тестирование программы перед выполнением

Windows PowerShell имеет функцию whatif, которая сообщит вам о результате команды, без её исполнения.

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

stop-service w3* -whatif

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

Получение расшифровки

PowerShell позволяет вам получить расшифровку всех ваших команд. Это облегчит тестирование команд, и одновременно сохранят их для последующего исполнения в скриптах.

Start-Transcript -Path c:\demo\dfoshow.txt
Stop-Transcript

Диски PowerShell

PowerShell позволяет получить доступ к различных дискам. Следует иметь в виду, что в качестве дисков могут выступать не только привычные нам объекты файловой системы, но и другие элементы, например, разделы реестра, переменные среды и т.д. Для доступа к этим дискам используется командлет Get-Psdrive, который выводит все диски. Диски выделяются двоеточием после их имени (:).

Get-Psdrive
cd HKCU:
dir
или
cd ENV:
ls
или
cd CERT:
Get-Childitem

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

  • dir - как в Windows
  • ls - как в UNIX
  • Get-Childitem - собственный командлет

Команды dir, ls и Get-Childitem имеют одинаковые возможности. Это означает, что вы можете использовать те псевдонимы, которые вам больше нравятся. Одно замечание о реестре. По нему можно перемещаться при помощи команд dir и cd, но они не позволяют просмотреть значения ключей реестра. Причина в том, что значения реестра являются свойствами объектов реестра, в то время как размер (Size) или дата последнего изменения (Date last accessed) – это свойства файла. Чтобы увидеть значения реестра, необходима команда Get-ItemProperty. Эта команда выводит все свойства элемента реестра и их значения. Дополнительные сведения можно найти в справке по Windows PowerShell.

Псевдонимы

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

Get-Alias | Sort-Object Definition

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

Get-Childitem * -Exclude *.tmp | Select-Object name, length

можно заменить на

ls * -ex *.tmp | select n*, le*


Реагирование на события WMI

Поддержка событий — одна из превосходных особенностей ОС Windows. Всякий раз, когда в операционной системе что-то происходит, она инициирует событие. Приложения могут подписываться на уведомления о конкретных событиях и реагировать на них, например выполнением определенных действий. В частности, при щелчке кнопки в диалоговом окне приложение может получать уведомление о событии «щелчок кнопки» и выполнять все предназначенные для этого события действия.

Инициировать события способна также служба Windows Management Instrumentation (WMI), и можно подписать Windows PowerShell версии 2 для получения этих событий. После этого можно задействовать Windows PowerShell для выполнения любых команд, которые должны выполняться в ответ на эти события. Обычно WMI порождает одно из довольно ограниченного числа событий, но это может происходить в одном из огромного количества различных классов WMI. Существуют три ключевых момента использования событий WMI:

  • понимание, какое событие требуется отслеживать
  • понимание класса требуемого события
  • использование командлета Register-WmiEvent для подписки на уведомления о событиях

Простые события

Инициировать события могут некоторые классы WMI. Например, класс Win32_ProcessStartTrace инициирует события в момент запуска процесса. Он делает то же самое в других ситуациях. Когда инициируется событие создания нового процесса, в качестве идентификатора источника оно содержит «Process Started». Для подписки на события необходимо выполнить следующую команду:

Register-WmiEvent –class "Win32_ProcessStartTrace"
–sourceIdentifier "Process Started"

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

Выполните командлет Get-EventSubscriber, чтобы увидеть только что созданную подписку на уведомления о событии. Чтобы удалить все подписки на события, выполните команду Get-EventSubscriber | Unregister-Event. Также можно задействовать командлет Unregister-Event, чтобы удалить подписку по ее идентификационному номеру.

Полезные события

WMI может инициировать и намного более полезные события системного уровня. Например, событие __instancecreationevent инициируется всякий раз, когда создается новый экземпляр класса WMI, а событие __instancedeletionevent — при удалении экземпляра. Это может показаться не совсем полезным, но только подумайте:почти каждый элемент операционной системы и компьютерного оборудования представлен некоторым экземпляром класса WMI. Например, при подключении съемных устройств хранения данных создается новый экземпляр класса Win32_LogicalDisk. А при завершении процесса удаляется экземпляр класса Win32_Process. Хотите отобразить на экране сообщение, когда пользователь подключит внешний USB-диск?

Register-wmievent –query "select * from __instancecreationevent within 5 where targetinstance isa 'win32_logicaldisk'" –action { Write "You had better not put any proprietary information on that!" }

Этот непростой запрос, поэтому поясним, что он делает:

SELECT * FROM __instancecreationevent (кстати, в названии события два подчеркивания) просто указывает, что нужно получить все свойства данного события;

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

WHERE TARGET INSTANCE ISA 'Win32_LogicalDisk' сообщает WMI, что нужны только события создания нового экземпляра класса Win32_LogicalDisk.

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

Использование параметра –computerName для подписки на события, которые происходят на удаленном компьютере, — это такая особая уловка. Это связано с тем, что необходимо иметь права локального администратора на удаленном компьютере, а само действие происходить на локальном компьютере.

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

Предостережения и уловки

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

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

Из блока сценария –action есть доступ к автоматической переменной $args, которая содержит все аргументы, передаваемые от события. Используйте Write $args в блоке сценария –action, чтобы увидеть, какие аргументы есть у данного события WMI.

Источник: Windows PowerShell: Реагирование на события WMI


FAQ

Часто задаваемые вопросы

Как запускать файлы EXE, COM, CMD, BAT

Просто укажите полный путь к файлу или только имя файла, если путь к нему содержится в переменной Path

Как вызвать скрипт из текущей папки если папка не содержится в переменной Path

Укажите полный путь к файлу или используйте .\ для обозначения текущего каталога:

.\Test.Ps1

Как использовать переменные окружения?

В PowerShell переменные окружения вынесены в специальный диск: Env:\

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

Write-Host "Добро пожаловать $($env:computername)!"

Как выполнить VB Script код в PowerShell (например если вы знаете как что то сделать в VBS, но не знаете как в PowerShell)?

$vbs = New-Object -com MSScriptControl.ScriptControl
$vbs.Language = "VBScript"
$vbs.Eval('msgbox("Привет!")')
$code = 'InputBox("Введите ваше имя","Анкета")'
$vbs.Eval($code)

Как выбрать файлы с размером более 1 Мб

dir | where {$_.length -ge 1mb}

Все процессы запущенные из папки Windows

Get-Process | where {$_.path -like "c:\windows*"} | Stop-Process -whatif

Расшаренные диски

Get-WmiObject win32_share | where {$_.path -like "?:\"}

Как посмотреть какие свойства есть у объекта?

С помощью команды Get-Member:

Get-Process | Get-Member -type property

Или с помощью команды Format-List *

Get-Process explorer | Format-List *

Как выбрать только некоторые строки, например, для обработки текстового файла

Используйте Select-String:

Get-Content C:\Windows\WindowsUpdate.log | Select-String "error|warning"
Get-Content C:\Windows\WindowsUpdate.log | where {$_ -match "error 0x(\d+)"} | foreach {$_.matches[1]}

Включить регистр символов

Операторы -eq -like -match и т.п. не чувствительны к регистру символов. Припишите к оператору букву "c" (от Case), если регистр важен:

"Test" -eq "test"
"Test" -ceq "test"

Как посмотреть что это за команды - "%", "?", "gps" или "fl"?

Get-Command % | fl
Get-Command `? | fl
Get-Command gps, fl | ft -AutoSize

Как изменить приглашение (prompt)?

Надо переопределить функцию prompt. Всё что вернёт эта функция будет приглашением. А можно в ней же выполнить и другие команды:

function prompt {
$host.UI.RawUI.WindowTitle = Get-Location ;

$env:username + "@" +

$env:computername + ":" +

(get-location | split-path -leaf) + "> "}

Получить текущий каталог

В cmd.exe есть переменная %cd% возвращающая текущий каталог. В PowerShell используется команда $pwd. Кроме того можно получить текущий каталог с помощью команды Get-Location.

Как вывести текст, и не переводить курсор на другую строку?

Write-Host "Начало строки." -noNewLine; Write-Host " Конец строки."

Как изменить фон и цвет шрифта в окне PowerShell?

Задать соответствующие свойства объекта $host:

$host.UI.RawUI.BackgroundColor = "Black"
$host.UI.RawUI.ForegroundColor = "Green"

Иногда бывает необходимо выделить результаты при помощи цвета, сделав их удобнее для чтения. Команда Write-Host имеет такие параметры, как -Foregroundcolor и -Backgroundcolor.

Write-Host "Ошибка!" -ForegroundColor "Red"
Write-Host "Красный текст на синем фоне" -Foregroundcolor red -Backgroundcolor blue

Команда Get-Help Write-Host -Detailed даст вам полный список возможных цветов. Более наглядный пример для вывода всех 16 цветов.

0..15 | %{Write-Host " " -back $_ цвет;[System.ConsoleColor]$_}

Но, по возможности используйте командлеты Write-Error, Write-Verbose и Write-Warning. Например:

Write-Warning "Будьте внимательны"

Как изменить цвета других сообщений, например ошибок или предупреждений?

Нужно задать соответствующие свойства

$host.PrivateData.ErrorForegroundColor
$host.PrivateData.WarningForegroundColor

$host.PrivateData.VerboseForegroundColor

Как создать алиас (псевдоним)?

Set-Alias ss Select-String

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

function fh ($Topic) {Get-Help $Topic -full | more}

А если вы хотите чтобы эти алиасы/функциии сохранились - надо поместить их в свой профиль.

Как создать/изменить профиль?

Если он уже существует (Test-Path $Profile) то можно открыть его например так:

notepad $profile

Если же он еще не создан (при установке PowerShell не создает профиль) то можно создать его вот так:

New-Item -Type file -Path $profile -Force

Как вставить в строку значение свойства объекта или результат выражения?

$e = Get-Process explorer
Write-Host "Путь к проводнику: $e.Path" # не получится

Write-Host "Путь к проводнику: $($e.Path)"

Write-Host "Путь к проводнику: $((Get-Process explorer).Path)"

Write-Host "Дважды два равно $(2 * 2)!"

Как посчитать количество объектов в конвейере?

Используйте командлет Measure-Object или свойство массивов .Count

Get-Process | where {$_.ws -gt 50mb} | Measure-Object
(Get-Process | where {$_.ws -gt 50mb}).count

Как запустить скрипт из планировщика?

Следует запустить C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe с ключем -Command Скрипт

Еще полезные ключи powershell.exe:
-NoLogo
-NonInteractive
-NoProfile

У командлетов зачастую весьма длинные названия аргументов. Можно не писать их полностью?

У большинства команд задан порядок следования аргументов. Если известен этот порядок, то можно вообще не писать названия аргументов:

Set-Content -Path test.txt -Value "Text"
Set-Content test.txt "Text"

Можно дополнять имена аргументов с помощью клавиши табуляции.

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

Write-Host test -f red -b blue
Get-Command -n process # Не сработает, потому что есть еще аргумент -Name
Get-Command -no process # Сработает, потому что это уже точно не -Name

Как при написании скрипта или команды перейти на следующую строчку?

Используйте символ апострофа:

Get-Command `
-Name Explorer

Как использовать в строке символы перевода строки, табуляции, и т.п.?

С новой строки - `n;`t - табуляция, символ кавычек - `" и апострофа ` - `

В качестве маскирующего символа в PowerShell используется апостроф. Если бы, как обычно, использовался обратный слеш - из PowerShell получился бы ужасный шелл.

Как посмотреть справку по команде?

Get-Help
Get-Help Get-Process

Get-Help Get-Process -Full

Get-Help Get-Process -Parameter Name

Get-Help Get-Process -Examples

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

Get-Help about_* | Format-List Name, Synopsis
Get-Help About_if | more

Как подключать расширения PowerShell , например расширение для работы с Exchange 2007

Get-pssnapin -registered | add-pssnapin

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

Всё, что не присваивается переменной - возвращается. В общих чертах так. Т.е. function test {"text"} вернёт строку "text"

При подготовке материала использовалась страница http://social.technet.microsoft.com/Forums/ru/scrlangru/thread/ae5a2186-3e20-4988-becf-dca45a1775ad

Как управлять групповыми политиками

C выходом Windows 7 и Windows Server 2008 R2 появилась возможность не только работать с объектами групповых политик GPO, но делать более сложные вещи:

  • Создавать, удалять, проводить резервное копирование, собирать отчеты и импортировать GPO;
  • Создавать, обновлять и удалять связь объектов групповых политик с контейнерами Active Directory Directory Services;
  • Конфигурировать наследование и права доступа к организационным единицам OU;
  • Настраивать параметры Group Policy Preferences хранящиеся в реестре;

Подробности в документации. Например, здесь.


Примеры

Получить список установленного программного обеспечения

С помощью командлета Get-ItemProperty можно прочитать значения определенного раазделеа реестра и создать список установленого программного обеспечения.

Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Format-Table DisplayName, Publisher

Просмотр записей реестра

Для просмотра всех записей реестра, например в разделе HKEY_CLASSES_ROOT делаем следующее:

Dir Registry::HKEY_CLASSES_ROOT

Можно также смонтировать виртуальный диск, для этой ветки реестра:

New-PSDrive HKCR Registry Registry::HKEY_CLASSES_ROOT

И набрав команду

Dir HKCR:

мы увидим все записи ветки HKEY_CLASSES_ROOT.

Проверяем существование ключа реестра

Если вы хотите, проверить, существует ли определенный ключ реестра, то вы должны помнить, что все ключи реестра, рассматриваются как папки на диске, поэтому у них есть пути. Их существование можно проверить так:

Test-Path HKCU:\Software\Testkey

Создание записи в реестре

Для упрощения создания записей в системном реестре можно с использованием вот такой функции Set-RegistryValue.

function Set-RegistryValue($key, $name, $value, $type="String") {
    if ((Test-Path $key) -eq $false) { md $key | Out-Null }
    Set-ItemProperty $key $name $value -type $type
}

И пример её использования:

Set-RegistryValue HKCU:\Software\TestABC myValue Hello
Set-RegistryValue HKCU:\Software\TestABC myValue 12 Dword

Заставьте Windows говорить из командной строки

Так как PowerShell оптимизирована для работы с объектами, то к ней можно легко подключить как COM-объекты, так и .NET framework. Нижеуказанные команды заставят Windows произнести фразу «Hello, cat Booblik».

$spVoice = new-object -com "SAPI.spvoice"
$spVoice.Speak("Hello, cat Booblik")

Доступ к приложениям

Следующая команда, которая легко может быть сделана частью скрипта, воспроизведёт песню группы The Posies в Windows Media Player. Это очень простой пример (смотри в ScriptCenter для примеров работы с тем же WMP 11), но он очень хорошо показывает, как PowerShell обеспечивает полный доступ к любому приложению.

$band = "Bob Acri"
$player = New-object -com wmplayer.ocx
$playlist = $player.mediacollection.getbyauthor($band)
$player.openPlayer($playlist.item(0).sourceurl)

Windows PowerShell как калькулятор

PowerShell позволяет производить вам простейшие математические операции прямо из командной строки.

2*2

Также можно узнать, сколько дисков вместительностью 700 Мб понадобится для архивации 11Гб

11gb/700mb

Или, например, сколько терабайт (1000 Гб) понадобится для архивирования 425 компьютеров с Vista, в которых винчестеры по 320 Гб

(320gb*425)/1000GB

Создание диапазона чисел

С помощью PowerShell можно легко задать диапазон чисел, приведем пример преобразования ascii кодов в символы:

65..90 | Foreach-Object { "$([char]$_):" }

Вот результат моего выполнения:

A:
B:
C:
D:
E:
F:
G:
H:
I:
J:
K:
L:
M:
N:
O:
P:
Q:
R:
S:
T:
U:
V:
W:
X:
Y:
Z:

Дата и время

Для просмотра системной даты и времени используется командлет Get-Date, а для изменения - командлет Set-Date. Этот командлет изменяет системные дату и время, заменяя их указанными значениями. Указать новую дату и время можно в виде строки, или передав командлету Set-Date объект DateTime или TimeSpan. Для указания новой даты или времени используйте параметр –Date. Этот параметр устанавливает указанные значения даты и времени. Можно ввести новую дату в кратком формате даты, а время в стандартном формате времени для используемой локали. Если задана только дата (без времени), то командлет Set-Date устанавливает время на полночь указанной даты. Если указано только время, дата не изменяется:

Set-Date -Date "24.01.2010 13:23:26"

Использование PowerShell как счётчика дней

Чтобы узнать, сколько дней осталось, до Нового Года, надо всего лишь ввести следующее.

([DateTime]"1/1/2011" -[datetime]::now).days

Использование PowerShell для управления Windows: файлы, WinSAT, UAC, и Bitlocker

Если вы IT администратор, и исследуюте новую функциональность Windows Vista/Windows 7, вы можете испытать несколько примеров.

Сколько файлов типа Х существует на вашем компьютере?

В Windows много новых форматов файлов для ведения логов, управления групповой политикой, и т.д. PS1 – расширение для файлов скриптов PowerShell. Это команда результатом которой, будет вывод количества файлов VB скиптов, Bat-файлов и скриптов PowerShell в папке и её подпапках.

dir -include *.vbs, *.ps1, *.bat -recurse | group-object extension –noelement

Список имен файлов в заданном каталоге

С помощью командлета Resolve-Path можно посмотреть список имен файлов в заданом каталоге. Для примера выведем все log-файлы в системной папке Windows.

Resolve-Path $env:windir\*.log

Сбор данных Windows System Assessment Tool из командной строки

Windows System Assessment Tool, просчитывает рейтинг (1- плохо, 5- хорошо) для процессора, дискового массива, графики, и т.д., для того чтобы вы могли получить финальные результаты производительности, и решения для её повышения. Так как эти данные хранятся в WMI, то PowerShell может сам собрать эти данные с нескольких ПК, и позволит быстро определить вам общее состояние каждого из них, при этом без необходимости обращаться к каждому отдельно. Эта команда, с помощью которой WSAT соберет данные с ПК и выведет их на экран в виде красивой, автоматически подогнанной под размеры экрана, таблицы.

get-wmiobject win32_winsat | format-table __SERVER, *SCORE -autosize

Конфигурирование User Account Control

User Account Control помогает увеличить безопасность ПК, требуя запуска всех программ, с пониженными, пользовательскими правами. Некоторые администраторы интересуются, могут ли они отключить данную функцию, если им необходимо выполнить ряд действий, требующих права администратора. Следующий запрос может быть использован для отключения UAC, с последующим его включением. Значение 0 – выключит UAC, а 2 – мгновенно включит.

set-itemproperty -path HKLM:\SOFTWARE\MICROSOFT\WINDOWS\CurrentVersion\Policies\System -name ConsentPromptBehaviorAdmin -value 0

Управление BitLocker через PowerShell

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

$drives = get-wmiobject -namespace root\CIMv2\Security\MicrosoftVolumeEncryption -class Win32_EncryptableVolume
$drives | format-table DriveLetter, PersistentVolumeID -autosize
$BitLockDrive = $drives[0]
$BitLockDrive.GetProtectionStatus()
$BitLockDrive.DisableKeyProtectors()
$BitLockDrive.EnableKeyProtectors()

Поиск истории обновлений

Всякий раз, когда Windows устанавливает обновления через Windows Update, он регистрирует их, в Windowsupdate.log файле. С PowerShell можно разобрать этот файл. Вы должны использовать следующую команду, что б выяснить, сколько обновлений вы получили и в какие даты:

Get-Content $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*'} |  Foreach-Object { $_.Split("`t")[0] } | Group-Object –NoElement

На компьютере с недавно установленной Windows обновлений еще мало, поэтому в этом примере результат будет не слишком велик:

Count Name
---------
     1 2009-11-01
     1 2010-01-27
   21 2010-01-31
     1 2010-04-05

Тут читается log-файл, где выбираются только строки с ключевыми словами "successfully installed", извлекает дату установки, которая стоит в начале строки отделенная табуляцией.

Запуск Explorer с открытым каталогом

Если мы работаем в консоли с папками, и перешли в какой-то каталог, то набрав команду

ii .

или

explorer .

мы увидим графическое окно Explorer с открытым каталогом.

Управление процессом программы

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

$notepad = Start-Process notepad -passthru
Start-Sleep 2
Stop-Process -inputObject $notepad

Чтение журнала системных событий

Эта строка выведет все предупреждения из журнала событий:

Get-EventLog System | Where-Object { $_.EntryType -eq 'Warning' }

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

Get-EventLog System -EntryType Warning

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

Использование переменной $null

Вы можете использовать $null в качестве специальной переменной, представляющей значение "ничего”. Вы можете использовать её, чтобы определить (и разобраться) не существующие данные, например:

Get-Process | Where-Object { $_.Company -ne $null } | Select-Object Name, Company

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

Get-Process | Where-Object { $_.Company -ne $null } | Where-Object { $_.Company -ne ''} | Select-Object Name, Company

Clip.exe

В состав Windows 7 входит утилита clip.exe, которая копирует все, что вы ему передатите в буфер обмена. Например код

Get-Process | clip

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

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------

     79       4     1064        128    21     0,11   2608 alg

    139       8     2324        208    32     0,17   1712 AppleMobileDeviceS...

     34       2     5592        972    30     1,01   1784 aspell

    121       4    13896      13324    38             632 audiodg

    127       6     3284       2176    72    80,47   2728 avgnt

    117      10    82180       7956   145   158,09   1668 avguard

    179       9     3832       2104    62 2 623,95   4716 bmctl

А вот такой код скопирует в буфер обмена имена файлов и папок, которые лежат в папке D:\Music.

Set-Location 'D:\Music'$l = Get-LocationGet-ChildItem $l | clip

Создание файлов с именами текущей даты

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

(Get-Date -format 'yyyy-MM-dd hh-mm-ss') + '.tmp'

Получить IP-адреса хоста

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

$hostname = "microsoft.com"
$result = [system.Net.Dns]::GetHostByName($hostname)
$result.AddressList | ForEach-Object {$_.IPAddressToString }

Открыть сайт в IE

Открыть программно веб-сайт через Internet Explorer по его адресу можно так:

$ie = new-object -com "InternetExplorer.Application"$ie.Visible = $true
$ie.navigate("www.microsoft.com")

Гимн России

Выполните в PowerShell следующий скрипт:

for ($i=200; $i -le 223; $i++)
{
   (nslookup 62.76.96.$i)[3].ToString().Replace('.', ' ').Substring(9)
}

Результатом такого опроса будет вот такой вот текст:

Rossija svjashhennaja nasha derzhava
Rossija ljubimaja nasha strana
Moguchaja volja velikaja slava
Tvojo dostojanie na vse vremena
Slavsja Otechestvo nashe svobodnoe
Bratskikh narodov sojuz vekovojj
Predkami dannaja mudrost narodnaja
Slavsja strana My gordimsja tobojj
Ot juzhnykh morejj do poljarnogo kraja
Raskinulis nashi lesa i polja
Odna ty na svete Odna ty takaja
Khranimaja Bogom rodnaja zemlja
Slavsja Otechestvo nashe svobodnoe
Bratskikh narodov sojuz vekovojj
Predkami dannaja mudrost narodnaja
Slavsja strana My gordimsja tobojj
Shirokijj prostor dlja mechty i dlja zhizni
Grjadushhie nam otkryvajut goda
Nam silu dajot nasha vernost Otchizne
Tak bylo tak est i tak budet vsegda
Slavsja Otechestvo nashe svobodnoe
Bratskikh narodov sojuz vekovojj
Predkami dannaja mudrost narodnaja
Slavsja strana My gordimsja tobojj