PowerShell: часто задаваемые вопросы. Продолжение. Работа с текстом powershell


Замена строк в файлах с использованием PowerShell | Windows IT Pro/RE

(см. листинг 1).

Собственные возможности PowerShell

С помощью имеющихся в PowerShell операторов -like, -match и -replace пользователи, мало знакомые с программированием, могут без труда сопоставлять и заменять строки. В командной строке PowerShell проще экспериментировать с регулярными выражениями. NET, чем в традиционных языках сценариев. Регулярное выражение (иногда именуемое regex) — строка, содержащая специальные символы или последовательности символов, которые представляют другие символы или их последовательности. Регулярные выражения похожи на универсальные символы, но гораздо выразительнее. Знакомство с регулярными выражениями можно начать с раздела about_regular_expressions в «Справке PowerShell». Для просмотра раздела введите

Get-Help about_regular_expressions

в командной строке PowerShell.

Очевидная область применения регулярных выражений — замена строк в файлах. Например, требуется извлечь только имена компьютеров из вывода команды Net View. Если запустить команду

Net View > List.txt

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

Get-Content List.txt | Where-Object {$_ -match '^\\\\'} | ForEach-Object {$_ -replace '^\\\\ (\S+).+','$1'}

Хотя команда показана на нескольких строках, ее следует вводить в одной строке в консоли PowerShell. То же относится и к другим командам, разнесенным по нескольким строкам. Команда Get-Content извлекает отдельные строки из List.txt. Затем команда Where-Object с помощью оператора -match проверяет, начинается ли строка с двух обратных косых черт. Такие строки передаются в команду ForEach-Object, где с помощью оператора -replace отбираются только имена компьютеров.

Остановимся подробнее на операторе -match, который используется с последовательностью ^\\\\. Символ каре (^) указывает, что нужно сопоставить начальные символы. Косая обратная черта — управляющий символ для регулярных выражений, поэтому нужно использовать две косые обратные черты (\\) для представления одной косой обратной черты (\). Таким образом, в общей сложности получается четыре косые обратные черты. В таблице 1 описаны этот и другие шаблоны регулярных выражений, используемые в команде.

 

Таблица 1. Шаблоны в коде извлечения

Сценарий Replace-FileString.ps1

Часто при работе с текстовыми файлами бывает полезно заменить строки в файле с использованием регулярных выражений, а затем записать результаты в первоначальный файл. В PowerShell нет команды с такой функциональностью, поэтому я подготовил сценарий Replace-FileString.ps1. Его действие аналогично открытию файла в программе «Блокнот», выполнению операции поиска и замены и сохранению файла. Но, в отличие от «Блокнота», этот сценарий можно использовать для замены строк в нескольких файлах одновременно.

Replace-FileString.ps1 обеспечивает поиск с переходом через разрывы строк, так как для считывания текста вместо команды Get-Content используется метод ReadAllText класса System.IO.File из Windows.NET Framework. В отличие от Get-Content, который считывает строки файла только по одной, метод ReadAllText читает каждый файл как одну строку, поэтому находит строки с разрывами. Из-за того что каждый файл рассматривается как одна строка, обработка очень больших файлов замедляется.

Для Replace-FileString.ps1 требуется PowerShell 2.0. Параметры командной строки для сценария приведены в таблице 2. Кроме параметров, перечисленных в таблице 2, сценарий распознает типовые параметры -Confirm, -Verbose и -WhatIf.

 

Таблица 2. Параметры сценария Replace-FileString.ps1

Существует два обязательных параметра: -Pattern и -Replacement. Также необходимо указать файл, в котором будут выполнены поиск и замена строк. Сделать это можно двумя способами. Первый способ — использовать параметр -Path или -LiteralPath в команде следующего вида:

Replace-FileString -Pattern 'this' -Replacement 'that' -Path Test.txt

Обычно нет нужды использовать параметр -LiteralPath, если только не требуется указать путь или имя файла с символами, часто интерпретируемыми PowerShell как универсальные. Типичный пример — квадратные скобки, [].

Второй способ — направить объекты файла в сценарий с использованием такой команды, как

Get-Item Test.txt | Replace-FileString -Pattern 'this' -Replacement ‘that’

Чтобы продемонстрировать использование Replace-FileString.ps1, рассмотрим три примера применения. В них показано, как с помощью сценария преобразовать вывод Net View в список имен компьютеров с разделительными запятыми, заменить данные в. ini-файлах и заменить путь LDAP в наборе сценариев.

Пример применения 1

Предположим, что требуется преобразовать вывод Net View в список имен компьютеров с разделителями запятыми. Сначала можно использовать команду Net View с операторами -match и -replace для формирования списка имен компьютеров, например:

Net View | Where-Object {$_ -match '^\\\\'} | ForEach-Object { $_ -replace '^\\\\ (\S+).+','$1'} | Out-File Computers.txt

Описания шаблонов регулярных выражений можно найти в таблице 1. Файл Computers.txt содержит имена компьютеров из команды Net View, по одному имени в строке. Затем можно заменить в файле переходы на новую строку запятыми с помощью команды

Replace-FileString -Pattern '\r\n' -Replacement ',' -Path Computers.txt

Эта команда заменяет запятыми все символы \r\n (возврат каретки и перевод строки) в файле и выводит файл. При необходимости можно добавить параметр -Overwrite, чтобы заменить исходный файл измененной копией, например:

Replace-FileString -Pattern '\r\n' -Replacement ',' -Path Computers.txt -Overwrite

Пример применения 2

Предположим, у нас имеется приложение клиент-сервер MyApplication. Несколько компьютеров в сети используют клиентское приложение для подключения к серверу appserver1 через TCP-порт 7840. Чтобы устранить уязвимое место, администратор информационной защиты распорядился выполнять серверный компонент приложения на другом сервере (appserver2) и использовать другой порт (8740). Клиентское приложение хранит имя сервера и номер TCP-порта в файле C:\Program Files\My Application\MyApp.ini. На экране 1 показана соответствующая часть MyApp.ini для компьютера с именем acct15.

 

Экран 1. MyApp.ini

Нельзя просто передать обновленный экземпляр файла MyApp.ini на соответствующие клиентские компьютеры, так как этот файл содержит сведения о клиенте (в данном случае имя компьютера). Но можно использовать Replace-FileString.ps1 для обновления. ini-файлов в компьютерах.

Сначала необходимо поместить имена компьютеров, на которых выполняется клиентское приложение, в текстовый файл Clients.txt, по одному имени на строке (экран 2). Затем можно использовать команду в листинге 2, чтобы изменить файлы MyApp.ini.

 

Экран 2. Clients.txt

В этой команде Get-Content извлекает имя каждого компьютера из Clients.txt. Команда ForEach-Object получает файл MyApp.ini с каждого компьютера с помощью команды Get-Item.

Наконец, команда использует полученный объект-файл как входной для сценария Replace-FileString.ps1. С помощью шаблона и строк замены, описанных в таблице 3, наряду с параметром -Overwrite сценарий вносит изменения в MyApp.ini. Механизм регулярных выражений. NET не поддерживает управляющие последовательности (такие, как \r и \n) в строке замены, поэтому в команде используются круглые скобки и символы $1 для вставки разрыва строки.

 

Таблица 3. Шаблон для примера применения 2

Пример применения 3

Предположим, набор сценариев VBScript для управления системой был загружен из веб-узла в папку C:\SampleScripts на компьютере. Все сценарии содержат типовой LDAP-путь DC=fabrikam, DC=com. Вместо того чтобы редактировать сценарии по одному, можно использовать Replace-FileString.ps1, чтобы заменить типовой путь LDAP на путь LDAP для конкретной сети. Для этого достаточно выполнить команду

Replace-FileString -Pattern 'DC=fabrikam, DC=com' -Replacement 'your LDAP path' -Path C:\SampleScripts\*.vbs -Overwrite

Где ‘your LDAP path’ — путь LDAP конкретной сети.

Регулярные выражения — удобное средство изменения файлов

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

Билл Стюарт ([email protected]) — системный и сетевой администратор компании French Mortuary, Нью-Мехико

Листинг 1. Replace-FileString.ps1 # Written by Bill Stewart ([email protected]) # Replaces strings in files using a regular expression. Supports # multi-line searching and replacing. # requires -version 2 Replace-FileString.ps1 '(Ferb) and (Phineas)' '$2 and $1' Story.txt This command replaces the string 'Ferb and Phineas' with the string 'Phineas and Ferb' in the file Story.txt and outputs the file. Note that the pattern and replacement strings are enclosed in single quotes to prevent variable expansion. .EXAMPLE C:\>Replace-FileString.ps1 'Perry' 'Agent P' Ferb.txt -Overwrite This command replaces the string 'Perry' with the string 'Agent P' in the file Ferb.txt and overwrites the file. #> [CmdletBinding(DefaultParameterSetName="Path",                SupportsShouldProcess=$TRUE)] param(   [parameter(Mandatory=$TRUE,Position=0)]     [String] $Pattern,   [parameter(Mandatory=$TRUE,Position=1)]     [String] [AllowEmptyString()] $Replacement,   [parameter(Mandatory=$TRUE,ParameterSetName="Path",     Position=2,ValueFromPipeline=$TRUE)]     [String[]] $Path,   [parameter(Mandatory=$TRUE,ParameterSetName="LiteralPath",     Position=2)]     [String[]] $LiteralPath,     [Switch] $CaseSensitive,     [Switch] $Multiline,     [Switch] $UnixText,     [Switch] $Overwrite,     [Switch] $Force,     [String] $Encoding="ASCII" ) begin {   # Throw an error if $Encoding is not valid.   $encodings = @("ASCII","BigEndianUnicode","Unicode","UTF32","UTF7",                  "UTF8")   if ($encodings -notcontains $Encoding) {     throw "Encoding must be one of the following: $encodings"   }   # Extended test-path: Check the parameter set name to see if we   # should use -literalpath or not.   function test-pathEx($path) {     switch ($PSCmdlet.ParameterSetName) {       "Path" {         test-path $path       }       "LiteralPath" {         test-path -literalpath $path       }     }   }   # Extended get-childitem: Check the parameter set name to see if we   # should use -literalpath or not.   function get-childitemEx($path) {     switch ($PSCmdlet.ParameterSetName) {       "Path" {         get-childitem $path -force       }       "LiteralPath" {         get-childitem -literalpath $path -force       }     }   }   # Outputs the full name of a temporary file in the specified path.   function get-tempname($path) {     do {       $tempname = join-path $path ([IO.Path]::GetRandomFilename())     }     while (test-path $tempname)     $tempname   }   # Use '\r$' instead of '$' unless -UnixText specified because   # '$' alone matches '\n', not '\r\n'. Ignore '\$' (literal '$').   if (-not $UnixText) {     $Pattern = $Pattern -replace '(? Листинг 2. Команда для изменения файлов MyApp.ini Get-Content Clients.txt | ForEach-Object {   Get-Item "\\$_\C$\Program Files\My Application\MyApp.ini" } |   Replace-FileString -Pattern 'Server=appserver1(\r\n)Port=7840'   -Replacement 'Server=appserver2$1Port=8740' -Overwrite

www.osp.ru

powershell - Замена содержимого текстового файла с помощью Powershell

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

$path = "c:\Users\$($env:username)\desktop\VPN.txt" (Get-Content $path) -replace "user1",$env:username | out-file $path
  • Закрыл путь в кавычках и использовал переменную, так как вы дважды вызывали путь.
  • %name% используется в командной строке. Переменные окружения в PowerShell используют поставщик $env:, который вы использовали один раз в своем фрагменте.
  • -replace - это инструмент, заменяющий регулярное выражение, который может работать против Get-Content, но вам нужно сначала записать результат в подменю.
  • Во-вторых, с -replace для регулярного выражения, и ваша строка не основана на регулярном выражении, вы можете просто использовать .Replace().
  • Set-Content обычно предпочтительнее Out-File по соображениям производительности.

Все, что сказано...

вы также можете попробовать что-то вроде этого.

$path = "c:\Users\$($env:username)\desktop\VPN.txt" (Get-Content $path).Replace("user1",$env:username) | Set-Content $path

Вы хотите только заменить первое вхождение?

Здесь вы можете использовать небольшое регулярное выражение с твиком в том, как вы используете Get-Content

$path = "c:\Users\$($env:username)\desktop\VPN.txt" (Get-Content $path | Out-String) -replace "(.*?)user1(.*)",('$1{0}$2' -f $env:username) | out-file $path

Regex будет соответствовать всему файлу. Есть две группы, которые он захватывает.

  • (.*?) - до первого "user1"
  • (.*) - Все после этого

Затем мы используем оператор формата, чтобы сэндвич нового имени пользователя между этими группами захвата.

qaru.site

PowerShell: часто задаваемые вопросы. Продолжение::Журнал СА 4.2008

PowerShell: часто задаваемые вопросыПродолжение

В своей предыдущей статье [1] я уже ответил на многие популярные вопросы о PowerShell и о некоторых моментах работы с ним. Но, конечно, в рамках одной статьи сложно рассказать обо всём, поэтому продолжим.

Как вывести в строке какие-либо переменные или свойства объекта?

Думаю, все знают, как в PowerShell вывести строку на экран:

PS> "Hello world!"

Hello world!

И как объединить несколько строк или переменных в одну строку тоже:

PS> $w = "World"

PS> "Hello " + $w + "!"

Hello world!

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

PS> "Hello $w!"

Hello world!

Логично, не правда ли? Но зачастую в строку надо вставить не простую переменную, а свойство какого-либо объекта, и тут возникает проблема:

PS> $file = Get-Item C:\test.zip

PS> "Размер файла $file составляет $file.Length байт"

Размер файла C:\test.zip составляет C:\test.zip.Length байт

Здесь я поместил в переменную $file объект, представляющий файл test.ps1, и затем пару раз упомянул его в строке. В первом вхождении переменная $file была преобразована в полный путь к файлу (всё равно как если бы мы выполнили метод $file.toString()). А во втором случае… Произошло то же самое! PowerShell посчитал, что .Length – это часть строки, не имеющая никакого отношения к переменной $file. Его тоже можно понять – вдруг пользователь пропустил пробел между предложениями? Но что же делать, если нам всё-таки надо поместить значение свойства в строку, а использовать временные переменные или использовать конкатенацию с помощью кучи плюсов не хочется? В таком случае нужно использовать конструкцию $(). Её можно вставить в строку, а между скобок поместить любое выражение. Это выражение будет выполнено, и его результат будет подставлен в строчку:

PS> "Размер файла $file составляет $($file.Length) байт"

Размер файла C:\test.zip составляет 1364964 байт

Неплохо? Но это еще не всё. Я не зря сказал, что внутрь $() можно поместить любое выражение, это действительно так:

PS> "Размер: $([Math]::Round($file.Length / 1kb)) килобайт"

Размер: 1333 килобайт

Тут я поделил размер файла в байтах на встроенную константу 1kb, и затем, воспользовавшись методом [Math]::Round() из .Net Framework, округлил полученный результат до целых. Есть и другой способ – воспользоваться оператором форматирования -f.

PS> "Размер: {0:n3} мегабайт" -f ($file.Length / 1mb)

Размер: 1,302 мегабайт

Те, кто знаком с программированием на языке C#, наверняка обрадуются знакомому синтаксису (http://msdn2.microsoft.com/en-us/library/fbxft59x.aspx). Для остальных же поясню:

Конструкция {0:n3} состоит из нескольких частей, первая из них – «0», это индекс элемента во втором операнде. В данном случае он один, но можно указать и несколько элементов, и при расстановке их внутри строки будет использоваться их порядковый номер, начиная с 0 у первого. Вторая часть конструкции – «n», указывает на то, что значение необходимо отформатировать как число (number), ну а следующая за нею цифра (в данном случае «3») определяет количество знаков после запятой.

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

PS> "{0}\{1:yyyy-MM-dd}.bak" -f $pwd, (Get-Date)

C:\backups\2008-04-12.bak

А какие в PowerShell маскирующие символы?

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

В PowerShell роль маскирующего символа выполняет «`» – апостроф, символ, расположенный на большинстве клавиатур на клавише «Ё», под тильдой. С его помощью можно маскировать любые символы:

PS> "`$pwd = $pwd"

$pwd = C:\root

Здесь я замаскировал символ «$» в первом упоминании переменной, и она не была преобразована в значение. Еще можно использовать маскирующий символ для обозначения специальных символов. Так, например, «`n» будет означать переход на следующую строку:

PS> "Первая строка`nВторая строка"

Первая строка

Вторая строка

Вот некоторые из часто употребляемых специальных символов:

  • `n – новая строка.
  • `a (alert) – этот символ заставляет спикер компьютера издавать писк. Бывает полезно для того, чтобы привлечь внимание пользователя.
  • `t – символ табуляции.

В чем отличия между разными типами кавычек в PowerShell?

Начнем с самых простых и популярных – двойных кавычек. В PowerShell, как и во множестве других языков, они служат для ограничения и обозначения строк. Все знают, что если набрать в командной строке PowerShell текст в кавычках, то он будет выведен на экран. Ну и, конечно, можно присвоить это текстовое значение переменной. Но, кроме того, точно так же можно работать и с многострочными текстами. Если, не закрыв кавычек, нажать <Enter>, то командная строка PowerShell переведет курсор на новую строку, и продолжит ожидание ввода. Так будет продолжаться, пока вы не закроете кавычки:

PS> $hw = "Hello

>> World!"

>>

PS>

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

$SqlCommand = "BACKUP DATABASE [$Base]

TO DISK = '$Path'

WITH INIT"

Перейдем ко второму типу кавычек, к одинарным. Их основное отличие от двойных – это то, что, если поместить внутри них название переменной, оно не будет преобразовано в её значение. Это хорошо видно на следующем примере:

PS> $var = '$pwd = ' + "'$pwd'"

PS> $var

$pwd = 'c:\root'

 Имя переменной внутри одинарных кавычек осталось неизменным, а внутри двойных кавычек было подставлено значение переменной вместо её имени. А еще в этом примере видно, что один тип кавычек можно без проблем использовать внутри других кавычек, не волнуясь о какой-либо маскировке. То есть если вам необходимо составить строчку, внутри которой множество одинарных кавычек (к примеру, фильтр для WMI), то удобнее будет заключить эту строку в двойные кавычки, и наоборот.

Второе отличие одинарных кавычек от двойных – это игнорирование символа маскировки – «`»:

PS> 'Первая строка`nВторая строка'

Первая строка`nВторая строка

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

PS> 'Одинарная кавычка '' среди собратьев'

Одинарная кавычка ' среди собратьев

Но что делать, если в нашей строке используется множество кавычек обоих видов, например, если нужно поместить в переменную кусок кода PowerShell или SQL? Для такого случая предусмотрена специальная разновидность кавычек, специально предназначенная для многострочных текстов (так же называемая HereString):

PS> $MyCode = @'

>> $Proc = Get-Process explorer

>> $Message = 'Переменная $Proc содержит сведения о процессе

>> например, в "$Proc.Path" содержится ' + "'$Path'."

>> '@

>>

PS> $MyCode

$Proc = Get-Process explorer

$Message = 'Переменная $Proc содержит сведения о процессе

например, в "$Proc.Path" содержится ' + "'$Path'."

Разумеется, есть и вариант HereString для двойных кавычек, в нём переменные преобразовываются в свои значения.

Как посчитать количество возвращенных командой объектов?

Очень часто встречающийся вопрос. Большинство командлетов в PowerShell в качестве результата возвращают несколько объектов, объединенных в массив. Ну и, разумеется, очень часто хочется посчитать количество этих результатов. Сделать это очень просто, достаточно приставить в конец конвейера командлет Measure-Object. Например, вот так можно посчитать количество журналов событий в системе:

PS> Get-EventLog -List | Measure-Object

Count : 11

Average :

Sum :

Maximum :

Minimum :

Property :

Думаю, многим интересно, что это за строки – Average, Sum и т. д. Дело в том, что возможности Measure-Object не ограничиваются подсчетом количества элементов (хотя по умолчанию делает только это). Он может производить и некоторые другие вычисления, причем не только над самими объектами, но и над их свойствами:

PS> Get-Process | Measure-Object -Property WS -Sum -Average

Count : 77

Average : 13063952,6233766

Sum : 1005924352

Maximum :

Minimum :

Property : WS

Так мы получили данные об используемой памяти (WorkingSet) – среднее значение на процесс и сумму по всем процессам.

Но вернёмся к нашему вопросу. Кроме использования Measure-Object, есть и другой способ, зачастую более удобный. У всех массивов в PowerShell есть свойство .Count, в котором и содержится количество элементов массива. Вот пример, как его можно использовать:

PS> $Shares = Get-WmiObject Win32_Share

PS> $shares.Count

5

Конечно, можно обойтись и без временной переменной, достаточно заключить выражение в скобки:

PS> (Get-WmiObject Win32_Share).count

5

PS> (Get-Process | where {$_.path -like "c:\win*"}).count

46

Здорово выполнять команды интерактивно в консоли или запускать из неё скрипты. Но для многих административных задач необходимо запускать скрипты из планировщика заданий. Как это сделать?

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

PS> Get-Help About_Signing

Ну а чтобы вызвать скрипт из планировщика, надо лишь в качестве запускаемой программы указать PowerShell.exe (полный путь – C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe), а в качестве аргумента – путь к файлу скрипта.

Если выполнить PowerShell.exe с ключом «/?», то можно узнать и о других полезных аргументах. Я опишу лишь ключи, полезные для автоматизированного запуска скриптов:

  • -NoLogo – не будет выводиться приветственная строка;
  • -NoProfile – не загружать профили PowerShell;
  • -NonInteractive – не выдавать запросов пользователю, т.е. при вызове, например Read-Line, произойдет ошибка, и выполнение скрипта будет продолжено;
  • -Command – указывается код PowerShell, выполняемый при запуске. Кстати, тут может быть не просто скрипт, но и полноценная команда.

У командлетов зачастую весьма длинные названия аргументов. Но иногда они вообще не указываются. Как это работает?

Возьмем в качестве образца командлет Set-Content. Полный его синтаксис предполагает следующую конструкцию:

PS> Set-Content -Path test.txt -Value "123" -Verbose

Тут мы говорим командлету поместить значение «123» в файл test.txt. Но обязательно ли указывать названия параметров Path и Value?

Если выполнить команду:

PS> Get-Help Set-Content -Parameter Path

то можно увидеть, что у этого параметра свойство Position равно 1. Это же свойство у параметра Value того же командлета равно 2. Это означает, что если мы не будем указывать имен параметров, то PowerShell посчитает первый аргумент значением для Path, а второй для Value. То есть можно выполнять команду вот так:

PS> Set-Content test.txt "123"

Зачем же тогда вообще может понадобиться указывать имена параметров, если всё работает и без них? Ну, во-первых, скрипт с полными именами параметров будет куда читабельнее, чем без них. Те, кто хоть раз ломал голову над своим скриптом многолетней давности, оценят. А во-вторых, если мы указываем названия параметров, – нам не нужно помнить их порядок, он может быть любым:

PS> Set-Content -Value "123" -Path test.txt

Но и в этом случае незачем писать полные имена параметров. Возьмем теперь команду с действительно длинными параметрами – Write-Host. У неё есть два параметра, позволяющие задать цвета выводимого текста и его фона: ForegroundColor и BackgroundColor. И свойство Position у этих параметров равно «Named» (в чем можно убедиться, выполнив команду:

PS> Get-Help Write-Host -Parameter ForegroundColor)

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

PS> Write-Host test -f red -b blue

test

Впрочем, чтобы было несколько понятнее, можно написать и так:

PS> Write-Host test -fore red -back blue

test

Но если мы, например, попробуем найти все команды, работающие с процессами, используя Get-Command, и вместо параметра -Noun укажем -n, то нас ждет сообщение об ошибке:

PS> Get-Command -n process

Get-Command : Не удается обработать параметр, так как имя параметра "n"

неоднозначно. Возможные совпадения: -Name -Noun.

В строка:1 знак:12

+ Get-Command <<<< -n process

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

Как получить значения параметров ключа реестра или, наоборот, задать их?

Несмотря на то что работа с реестром из PowerShell кажется очень простой, всё же существуют некоторые тонкости. Думаю, всем уже известно, что в PowerShell используется система так называемых «поставщиков» (provider), позволяющих работать с иерархическими системами хранения данных, как с обычной файловой системой (и даже автодополнение с помощью клавиши табуляции там тоже работает). И реестр как раз представлен в виде такого провайдера. Это дает возможность использовать для навигации по нему всё те же команды, как и для файловой системы: dir (Get-ChildItem), cd (Set-Location) или pwd (Get-Location). Но только этих команд для работы с реестром будет недостаточно.

Например, если нам понадобится посмотреть список автоматически запускаемых программ из HKCU:\Software\Microsoft\Windows\CurrentVersion\run, то одним Dir не обойтись. Дело в том, что параметры ключа не являются дочерними элементами по отношению к ключу. Они представляют собой его свойства, и для того чтобы получить их список, придётся использовать команду Get-ItemProperty (или её псевдоним – «gp»):

PS> gp HKCU:\Software\Microsoft\Windows\CurrentVersion\Run

Sidebar : C:\Program Files\Windows Sidebar\sidebar.exe /autoRun

MsnMsgr : "C:\Program Files\Windows Live\Messenger\MsnMsgr.Exe" /background

FolderShare : "C:\Program Files\FolderShare\FolderShare.exe" /background

Skype : "C:\Program Files\Skype\Phone\Skype.exe" /nosplash /minimized

WMPNSCFG : C:\Program Files\Windows Media Player\WMPNSCFG.exe

 PowerShell попытается самостоятельно подобрать наилучший метод форматирования, основываясь на количестве свойств объекта. Так, если у вас в этом ключе реестра менее 5 параметров, то они будут выведены в виде таблицы с параметрами в роли столбцов. Чтобы этого избежать, следует перенаправить вывод в командлет Format-List, используя конвейер. Для создания параметра используется командлет New-ItemProperty или Set-ItemProperty (псевдоним – «sp»):

PS> cd HKCU:\Software\Microsoft\Windows\CurrentVersion\Run

PS> sp -Path . -Name "Моя утилита" -Value "c:\ myutil.exe"

Тут я сначала установил в качестве текущего каталога ключ реестра, использовав cd (Set-Location). Затем с помощью командлета Set-ItemProperty создал параметр «Моя утилита» со значением «c:\myutil.exe» в текущем ключе (точка в качестве пути обозначает текущий каталог). Теперь можно проверить результат, снова использовав Get-ItemProperty, но на этот раз, указав ему конкретное свойство:

PS> gp . "Моя утилита" | Format-List

Моя утилита : c:\utils\myutil.exe

Ну и для завершения примера удалим этот созданный ключ. Не сложно догадаться, что для этого понадобится командлет «Remove-ItemProperty (“rp”)»:

PS> rp . "Моя утилита"

Как импортировать данные из Excel или, наоборот, поместить данные из PowerShell в Excel?

К сожалению, с PowerShell не поставляются командлеты для непосредственного импорта и экспорта файлов XLS. Но выход есть, и даже не один. Можно использовать для обмена данными с Excel файлы с разделителями запятыми – csv (Comma Separated File). По умолчанию этот формат даже открывается с помощью Excel и, разумеется, он может в него сохранять. Файлы CSV импортируются и экспортируются из PowerShell с помощью командлетов Import-Csv и Export-Csv соответственно.

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

Имя,Отчество,Фамилия

Иван,Иванович,Иванов

Пётр,Петрович,Петров

Сидор,Сидорович,Сидоров

Импортировав этот файл, мы получим массив из трёх объектов, обладающих свойствами «Имя», «Отчество», и «Фамилия»:

PS> $fio = Import-Csv fio.csv

PS> $fio[0]

Имя Отчество Фамилия

--- -------- -------

Иван Иванович Иванов

PS> $fio | foreach {$_.Фамилия}

Иванов

Петров

Сидоров

Ну и, конечно, если очень хочется работать напрямую с файлами XLS и XLSX, то можно воспользоваться сторонними командлетами, например, бесплатной оснасткой PowerData, которую можно скачать по адресу http://www.ultimate-projects.ru. Кроме командлетов Import-Excel и Export-Excel, в комплект входит Invoke-SQL для выполнения SQL‑запросов и получения результатов в виде объектов PowerShell.

Каким образом в PowerShell можно перехватить ошибку?

Хорошие возможности в области обработки ошибок, несомненно, являются очень важным фактором для скриптового языка при применении в рабочем окружении. К счастью, у PowerShell в этом плане всё обстоит прекрасно. Есть и автоматические параметры для всех командлетов – ErrorAction и ErrorVariable, позволяющие определить поведение команды в случае ошибки и поместить объект ошибки в указанную переменную. Присутствуют специальные переменные – $ErrorActionPreference (глобально задает реакцию на ошибки) и $Error, содержащая массив последних произошедших ошибок (самая последняя $Error[0]). Но одним из самых полезных средств, конечно, является ключевое слово «trap». После этого слова задается скриптовый блок, который будет выполнен в случае ошибки. Кроме этого, в том же блоке можно обратиться к объекту ошибки (который внутри этого блока будет находится в переменной $_) и указать дальнейшие действия – break (прервать выполнение) или continue (продолжить выполнение скрипта дальше).

PS> trap {echo "Ошибка: $_"; break}; 1; 2/$null; 3

1

Ошибка: Попытка деления на нуль.

Попытка деления на нуль.

At line:1 char:39

+ trap {echo "Ошибка: $_"; break}; 1; 2/ <<<< $null; 3

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

PS> trap {echo "Ошибка: $_"; continue}; 1; 2/$null; 3

1

Ошибка: Попытка деления на нуль.

3

Trap очень удобен для применения в скриптах. Его можно поместить, к примеру, в начале файла, применив в скриптовом блоке командлет Export-Clixml для сохранения объекта ошибки в XML-файл:

trap {$_ | Export-Clixml Error.xml; stop}

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

PS> $Err = Import-Clixml Error.xml

PS> $Err

Copy-Item : Не найдено сетевое имя.

At line:1 char:10

+ copy-item <<<<  file.txt \\server\share

PS> $Err.InvocationInfo

MyCommand             : Copy-Item

CommandLineParameters : {Destination, Path}

ScriptLineNumber      : 1

OffsetInLine          : 10

ScriptName            :

Line                  : copy-item file.txt \\server\share

PositionMessage       :

                        At line:1 char:10

                        + copy-item <<<<  file.txt \\server\share

InvocationName        : copy-item

PipelineLength        : 1

PipelinePosition      : 1

ExpectingInput        : False

CommandOrigin         : Runspace

 Жду новых вопросов на адрес. Ну и, конечно, заходите на мой блог – http://xaegr.wordpress.com.

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

  1. Гусев В. PowerShell: часто задаваемые вопросы. //Системный администратор, №3, 2008 г. – С. 16-22.

samag.ru

Создание отчетов в PowerShell / Хабр

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

Секреты создания отчетов Глава 33

Эта глава содержит
  1. Работа с HTML фрагментами
  2. Создание стильных HTML отчетов
  3. Отправка отчетов поэлектронной почте

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

33.1 Что не нужно делать. Начнем главу с того что мы считаем примером плохой техники создания отчетов. Мы постоянно встречаем такой стиль. Большая часть IT профессионалов не задумываются об этом и увековечивают в коде стиль из других языков, таких как VBScript. Следующий код написан в стиле, который как мы надеемся вы не будете применять, и который вы увидите в коде менее информированных системных администраторов. Листинг 33.1 Плохо спроектированный скрипт инвентаризации

param ($computername) Write-Host '------- COMPUTER INFORMATION -------' Write-Host "Computer Name: $computername" $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computername Write-Host " OS Version: $($os.version)" Write-Host " OS Build: $($os.buildnumber)" Write-Host " Service Pack: $($os.servicepackmajorversion)" $cs = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computername Write-Host " RAM: $($cs.totalphysicalmemory)" Write-Host " Manufacturer: $($cs.manufacturer)" Write-Host " Model: $($cd.model)" Write-Host " Processors: $($cs.numberofprocessors)" $bios = Get-WmiObject -Class Win32_BIOS -ComputerName $computername Write-Host "BIOS Serial: $($bios.serialnumber)" Write-Host '' Write-Host '------- DISK INFORMATION -------' Get-WmiObject -Class Win32_LogicalDisk -Comp $computername –Filt 'drivetype=3' | Select-Object @{n='Drive';e={$_.DeviceID}}, @{n='Size(GB)';e={$_.Size / 1GB -as [int]}}, @{n='FreeSpace(GB)';e={$_.freespace / 1GB -as [int]}} | Format-Table –AutoSize Код приведенный в листинге 33.1 произведет вывод подобный этому Фигура 33.1 вывод, основанный на строках.

Как видно этот скрипт работает, Дон Джонс (один из авторов) видя вывод из скрипта чистыми строками гневно произносит поговорку с участием божества и щенков (наверное, ругательство в оригинале Don has a saying involving angry deities and puppies that he utters whenever he sees a script that outputs pure text like this). Прежде всего – этот сценарий может выводить только на экран, т.к. вывод ведется через Write-Host. В большинстве случаев, когда вы будете использовать Write-Host, вы будете делать это неправильно. Было бы неплохо если была бы возможность вывести эту информацию в файл, или в HTML? Вы можете добиться этого изменяя все Write-Host на Write-Output, но это по-прежнему будет неправильный путь.

Есть более эффективные способы формирования отчета, и это причина по которой мы написали эту главу. Во-первых, мы предложили бы для каждого блока или функции, где происходит генерация информации создавать один объект содержащий всю нужную информацию. Чем больше вы разобьете на блоки код, тем больше вы сможете повторно использовать эти блоки. В нашем плохом примере, первый раздел «информация о компьютере», должно осуществляться функцией которую мы напишем. Ее можно будет использовать во всех отчетах подобного вида. В разделе «информация о диске» данные указываются одним объектом, объединять информацию из разных источников не нужно, но все командлеты на Write должны уйти. (прим переводчика. Как надо делать смотрите в примере к разделу 33.2.1 Получение исходной информации)

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

Правила нарушающиеся в этих сценариях следующие

  1. Выход представляет собой смесь текста и объектов
  2. Вывод сразу отформатирован
Это осознанное решение, так как известно, как будут применяться скрипты и как должен выглядеть отчет. Мораль этой истории выводить объектами, и быть готовым выйти за пределы парадигмы если на то есть причины.

33.2 Работа с HTML фрагментами и файлами Хитрость нашего способа в том, что ConvertTo-HTML можно использовать двумя различными способами. Первый способ – производить полную HTML страницу, второй – производить HTML фрагмент. Этот фрагмент всего лишь HTML таблица с данными что были переданы в командлет, мы произведем каждую секцию отчета в виде фрагмента, а затем соберем фрагменты в полную HTML страницу.

33.2.1 Получение исходной информации Мы начнем с того что соберем данные в объекты, по одному объекту для каждого раздела отчета. В нашем случае будет два объекта – информация о компьютере и информация о дисках. Условимся что для кротости и ясности мы пропустим обработку ошибок и другие тонкости. В реальных условиях мы добавили бы их. Get-WMIObject сама по себе производит объект содержащий информацию по дискам. Значит нужно еще создать функцию выдающую объект с информацией о компьютере.

function Get-CSInfo { param($computername) $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computername $cs = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computername $bios = Get-WmiObject -Class Win32_BIOS -ComputerName $computername #property names with spaces need to be enclosed in quotes $props = @{ComputerName = $computername 'OS Version' = $os.version 'OS Build' = $os.buildnumber 'Service Pack' = $os.sevicepackmajorversion RAM = $cs.totalphysicalmemory Processors = $cs.numberofprocessors 'BIOS Serial' = $bios.serialnumber} $obj = New-Object -TypeName PSObject -Property $props Write-Output $obj } Функция извлекает информацию из трех различных классов WMI. Создаем объект используя хеш таблицу, собранную из трех объектов т.к., хотим иметь возможность передавать вывод функции по конвейеру. Обычно мы предпочитаем давать свойствам имена без пробелов, сейчас отклонимся от этого правила потому что собираемся использовать имена в итоговом отчете.

33.2.2 Производство фрагментов HTML отчетов.

Теперь мы можем использовать написанную функцию чтобы получить отчет в HTML

$frag1 = Get-CSInfo –computername SERVER2 | ConvertTo-Html -As LIST -Fragment –PreContent '<h3>Computer Info</h3>' | Out-String Мы долго двигались к этому трюку, так что его обязательно нужно разобрать: 1. Вы сохраняете вывод в виде фрагмента HTML в переменную с именем $frag1, позже мы сможем вставить его в нужное место вывода либо целиком сохранить в файл. 2. запускается Get-CSInfo, ему передается имя компьютера с которого мы хотим получить данные, сейчас мы прописываем имя компьютера жестко, в будущем мы заменим его на переменную. 3. Получившийся вывод подаем на ConvertTo-HTML, эта команда формирует на выходе фрагмент HTML в виде вертикального списка, а не горизонтально. Список будет имитировать вид старого отчета по негодной-технике-выводить-информацию. 4. Мы используем параметр –PreContent чтобы добавить надпись перед табличкой отчета. Мы добавили теги чтобы получился жирный заголовок. 5. Все что получилось – это и есть трюк – передается дальше на Out-String. Вы увидите что ConvertTo-HTML поставит кучу всего в конвейер. Вы видите, что в конвейер пишутся строки, коллекции строк, всякие разные другие объекты. Все это приведет в конце к проблемам, когда вы попытаетесь собрать это все в окончательную HTML страницу, вместо мы просто подали на Out-String и получили на выходе старую добрую строку.   Можно пойти дальше и произвести второй фрагмент. Это легче т.к. не нужно писать функцию, генерация HTML будет выглядеть точно также. Единственное отличие что мы соберем данные этой секции в таблицу, а не список: $frag2 = Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3' -ComputerName SERVER2 | Select-Object @{name='Drive';expression={$_.DeviceID}}, @{name='Size(GB)';expression={$_.Size / 1GB -as [int]}}, @{name='FreeSpace(GB)';expression={ $_.freespace / 1GB -as [int]}} | ConvertTo-Html -Fragment -PreContent '<h3>Disk Info</h3>' | Out-String У нас есть оба фрагмента, можно приступить к формированию окончательного отчета.

33.2.3 Сборка финального HTML файла Сборка включает в себя добавление ваших двух фрагментов, и таблицы стилей. Использование таблицы стилей CSS и языка выходит за рамки этой книги. Таблица стилей позволяет контролировать форматирование HTML страницы так чтобы она выглядела намного лучше. Если вы хотите хороший учебник и ссылки на дополнительные материалы по CSS, проверьте  http://www.w3schools.com/css/

$head = @' <style> body { background-color:#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } </style> '@ ConvertTo-HTML -head $head -PostContent $frag1, $frag2 -PreContent "<h2>Hardware Inventory for SERVER2</h2>"  Создается таблица стилей $head, в переменной типа строка описывается нужный стиль. Затем эта переменная передается в параметр –head, а ваши фрагменты перечисляются через запятую в параметре –PostContent. Также добавляется заголовок отчета в параметре –PreContent. Сохраните весь сценарий как C: \ Good.ps1 и запустите его следующим образом:./good > Report.htm Это перенаправит вывод в файл Report.htm, который будет красив, как на рисунке 33.2   Рисунок 33.2 отчет из нескольких фрагментов   Может быть это не произведение искусства, но это отчет который выглядит лучше чем отчет на экране которым начиналась эта глава. В листинге 33.2 показан завешенный скрипт, где вы можете задать имя компьютера, по умолчанию localhost. В заголовке прописан [CmdletBinding()], что позволяет использовать –verbose. В теле скрипта вставлены Write-Verbose, вы можете видеть что делает каждый шаг.   Листинг 33.2 скрипт HTML инвентаризации<# .DESCRIPTION Retrieves inventory information and produces HTML .EXAMPLE ./Good > Report.htm .PARAMETER The name of a computer to query. The default is the local computer. #> [CmdletBinding()] param([string]$computername=$env:computername) # function to get computer system info function Get-CSInfo { param($computername) $os = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computername $cs = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computername $bios = Get-WmiObject -Class Win32_BIOS -ComputerName $computername $props = @{'ComputerName'=$computername 'OS Version'=$os.version 'OS Build'=$os.buildnumber 'Service Pack'=$os.servicepackmajorversion 'RAM'=$cs.totalphysicalmemory 'Processors'=$cs.numberofprocessors 'BIOS Serial'=$bios.serialnumber} $obj = New-Object -TypeName PSObject -Property $props Write-Output $obj } Write-Verbose 'Producing computer system info fragment' $frag1 = Get-CSInfo -computername $computername | ConvertTo-Html -As LIST -Fragment -PreContent '<h3>Computer Info</h3>' | Out-String Write-Verbose 'Producing disk info fragment' $frag2 = Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3' -ComputerName $computername | Select-Object @{name='Drive';expression={$_.DeviceID}}, @{name='Size(GB)';expression={$_.Size / 1GB -as [int]}}, @{name='FreeSpace(GB)';expression={$_.freespace / 1GB -as [int]}} | ConvertTo-Html -Fragment -PreContent '<h3>Disk Info</h3>' | Out-String Write-Verbose 'Defining CSS' $head = @' <style> body { background-color:#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } </style> '@ Write-Verbose 'Producing final HTML' Write-Verbose 'Pipe this output to a file to save it' ConvertTo-HTML -head $head -PostContent $frag1,$frag2 -PreContent "<h2>Hardware Inventory for $ComputerName</h2>"

Использование скрипта

PS C:\> $computer = SERVER01 PS C:\> C:\Scripts\good.ps1 -computername $computer | >> Out-File "$computer.html" >> PS C:\> Invoke-Item "$computer.html" Скрипт генерирует HTML файл, который можно использовать в будущем, и выводит на экран отчет. Имейте в ввиду что функция Get-CSInfo может использоваться повторно. Поскольку она выводит объект, а не текст вы можете его использовать в самых разных местах где потребуется выводить туже информацию. Если вам понадобилось добавить добавить еще информации к отчету, то для добавления новой секции вам будет нужно:
  • Написать функцию или команду генерирующую объект, с информацией новой секции отчета.
  • Создать из этого объекта HTML фрагмент и сохранить в переменную.
  • Добавить эту переменную в список переменных команды сборки окончательного отчета. Таким образом вы дополните отчет.
  • Все
 Да этот отчет — это текст. В конечном счете каждый отчет будет текстом, потому что текст — это то что мы читаем. Сутью этого метода является то что все остается объектами до последнего момента. Вы позволяете PowerShell форматировать за вас. Рабочие элементы этого скрипта могут быть скопированы и использованы в другом месте, что невозможно сделать с помощью исходного текста в начале главы.  33.3 отправка электронного письма Что может быть лучше HTML отчета? Отчет, который автоматически придет на email!   К частью PowerShell уже содержит командлет Send-MailMessage. Немного исправим наш скрипт:Write-Verbose 'Producing final HTML' Write-Verbose 'Pipe this output to a file to save it' ConvertTo-HTML -head $head -PostContent $frag1,$frag2 -PreContent "<h2>Hardware Inventory for $ComputerName</h2>" | Out-File report.htm Write-Verbose "Sending e-mail" $params = @{'To'='[email protected]' 'From'='[email protected]' 'Subject'='That report you wanted' 'Body'='Please see the attachment.' 'Attachments'='report.htm' 'SMTPServer'='mail.company.com'} Send-MailMessage @params мы изменили конец конвейера перенаправив вывод в файл. Затем использовали Send-MailMessage в качестве вложения. Можно отправить HTML как само тело сообщения. Вам не нужно для этого создавать файл на диске, вы можете взять вывод с конвейера непосредственно. Вот альтернативный примерWrite-Verbose 'Producing final HTML' $body = ConvertTo-HTML -head $head -PostContent $frag1,$frag2 -PreContent "<h2>Hardware Inventory for $ComputerName</h2>" | Out-String Write-Verbose "Sending e-mail" $params = @{'To'='[email protected]' 'From'='[email protected]' 'Subject'='That report you wanted' 'Body'=$Body 'BodyAsHTML'=$True 'SMTPServer'='mail.company.com'} Send-MailMessage @params Здесь мы построили параметры Send-MailMessage в хеш таблице и сохранили их в переменной $Param. Это позволяет использовать splat технику и скормить все параметры команде сразу. Нет никакой разницы что вы наберете их как параметры или укажете через хэш таблицу, работать будет в любом случае, но так лучше читать.  33.4 Итог Построение отчетов, безусловно большая потребность для администраторов, мы хотели показать, что PowerShell хорошо подходит для этой задачи. Хитрость заключается в том, чтобы создавать отчеты таким образом, чтобы извлечение информации отделить от форматирования и создания выхода. На самом деле PowerShell способен предоставить большие возможности по форматированию и выводу при небольшом количество работы с вашей стороны.

З.Ы. от переводчика для корректного отображения русского текста нужно использовать

$encoding = [System.Text.Encoding]::UTF8 Send-MailMessage @params -Encoding $encoding

habr.com

Приступаем к работе с PowerShell | Windows IT Pro/RE

Дон Джоунз ([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 и при этом не понимаете, что происходит «под капотом» и как можно автоматизировать задачу, чтобы она выполнялась быстрее и эффективнее... Ну, тогда вы относитесь к той категории работников, которых я называю «обезьяна у кнопки». Иными словами, заменить вас можно, что называется, в два счета. Что касается меня, я предпочитаю быть специалистом, обладающим доступными только для посвященных знаниями о том, как автоматизировать работу. Это избавляет меня от необходимости выполнять скучные повторяющиеся операции. А, кроме того, такого сотрудника будет не так-то просто уволить.

www.osp.ru

Работа со строками в PowerShell

PowerShellPowerShell

  • Время чтения: 5 мин
  • Соавторы

PowerShell — это оболочка командной строки на основе задач, созданная на базе .NET Framework, с языком сценариев. Она позволяет системным администраторам и опытным пользователям быстро автоматизировать администрирование различных операционных систем (Linux, macOS, Unix и Windows) и процессов, связанных с работающими в этих операционных системах приложениями.Built on the .NET Framework, PowerShell is a task-based command-line shell and scripting language; it is designed specifically for system administrators and power-users, to rapidly automate the administration of multiple operating systems (Linux, macOS, Unix, and Windows) and the processes related to the applications that run on those operating systems.

Исходный код PowerShell открытPowerShell is open source

Базовый исходный код PowerShell теперь доступен в GitHub, и участники сообщества могут вносить в него свои дополнения.PowerShell base source code is now available in GitHub and open to community contributions.См. Код PowerShell в GitHub.See PowerShell source on GitHub.

Вы можете начать с нужных вам элементов в разделе Получить PowerShell.You can start with the bits you need at get PowerShell.Или, возможно, с краткого обзора в разделе Приступая к работеOr, perhaps, with a quick tour at Getting Started

Задачи при проектировании сценариев PowerShellPowerShell design goals

Windows PowerShell помогает улучшить среду командной строки и сценариев за счет устранения застарелых проблем и добавления новых функций.Windows PowerShell is designed to improve the command-line and scripting environment by eliminating long-standing problems and adding new features.

Возможность обнаруженияDiscoverability

Windows PowerShell упрощает обнаружение своих возможностей.Windows PowerShell makes it easy to discover its features.Например, чтобы получить список командлетов для просмотра и изменения служб Windows, введите следующее:For example, to find a list of cmdlets that view and change Windows services, type:

Узнав, какой командлет выполняет задачу, можно получить дополнительные сведения о нем с помощью командлета Get-Help.After discovering which cmdlet accomplishes a task, you can learn more about the cmdlet by using the Get-Help cmdlet.Например, для отображения справки по командлету Get-Service введите:For example, to display help about the Get-Service cmdlet, type:

Большинство командлетов выводят объекты, которые могут быть обработаны и преобразованы в текст для просмотра.Most cmdlets emit objects which can be manipulated and then rendered into text for display.Чтобы полностью понять выходные данные этого командлета, передайте их в командлет Get-Member.To fully understand the output of that cmdlet, pipe its output to the Get-Member cmdlet.Например, следующая команда отображает сведения об элементах выходных данных объекта с помощью командлета Get-Service.For example, the following command displays information about the members of the object output by the Get-Service cmdlet.

ConsistencyConsistency

Управление системами может оказаться непростой задачей, а средства с согласованным интерфейсом помогают справляться с такими трудностями.Managing systems can be a complex endeavor and tools that have a consistent interface help to control the inherent complexity.К сожалению, согласованность не обеспечивают ни программы командной строки, ни COM-объекты сценариев.Unfortunately, neither command-line tools nor scriptable COM objects have been known for their consistency.

Согласованность Windows PowerShell является одним из его важнейших преимуществ.The consistency of Windows PowerShell is one of its primary assets.Например, если вы научитесь использовать командлет Sort-Object, эти знания можно применить для сортировки выходных данных любого командлета.For example, if you learn how to use the Sort-Object cmdlet, you can use that knowledge to sort the output of any cmdlet.Вам не нужно изучать разные процедуры сортировки для каждого командлета.You do not have to learn the different sorting routines of each cmdlet.

Кроме того, разработчикам командлетов не нужно проектировать возможности сортировки для своих командлетов.In addition, cmdlet developers do not have to design sorting features for their cmdlets.Windows PowerShell дает им платформу, которая предоставляет основные возможности и обеспечивает соответствие по многим аспектам интерфейса.Windows PowerShell gives them a framework that provides the basic features and forces them to be consistent about many aspects of the interface.Платформа частично лишает разработчиков свободы выбора, а взамен существенно упрощает разработку удобных и надежных командлетов.The framework eliminates some of the choices that are typically left to the developer, but, in return, it makes the development of robust and easy-to-use cmdlets much simpler.

Интерактивные среды и среды сценариевInteractive and Scripting Environments

Windows PowerShell — это объединенная интерактивная среда сценариев, которая предоставляет доступ к программам командной строки и COM-объектам, а также позволяет использовать возможности библиотеки классов .NET Framework.Windows PowerShell is a combined interactive and scripting environment that gives you access to command-line tools and COM objects, and also enables you to use the power of the .NET Framework Class Library (FCL).

Эта среда улучшает работу с командной строкой Windows, которая предоставляет интерактивную среду с несколькими программами командной строки.This environment improves upon the Windows Command Prompt, which provides an interactive environment with multiple command-line tools.Она также улучшает работу сценариев сервера сценариев Windows, которые позволяют использовать несколько программ командной строки и COM-объекты автоматизации, но не предоставляют интерактивную среду.It also improves upon Windows Script Host (WSH) scripts, which let you use multiple command-line tools and COM automation objects, but do not provide an interactive environment.

Объединяя доступ ко всем этим функциям, Windows PowerShell расширяет возможности интерактивного пользователя и разработчика сценариев, а также упрощает администрирование системы.By combining access to all of these features, Windows PowerShell extends the ability of the interactive user and the script writer, and makes system administration more manageable.

Ориентация на объектыObject Orientation

Хотя для взаимодействия с Windows PowerShell используются команды в текстовой форме, Windows PowerShell основан на объектах, а не тексте.Although you interact with Windows PowerShell by typing commands in text, Windows PowerShell is based on objects, not text.Выходные данные команды — это объект.The output of a command is an object.Его можно отправить в другую команду в качестве входных данных.You can send the output object to another command as its input.В результате Windows PowerShell предлагает привычный интерфейс для пользователей, знакомых с другими оболочками, а также представляет новую и эффективную концепцию командной строки.As a result, Windows PowerShell provides a familiar interface to people experienced with other shells, while introducing a new and powerful command-line paradigm.Он расширяет возможности передачи данных между командами, позволяя отправлять объекты, а не текст.It extends the concept of sending data between commands by enabling you to send objects, rather than text.

Легкий переход к сценариямEasy Transition to Scripting

Windows PowerShell облегчает переход от интерактивного ввода команд к созданию и выполнению сценариев.Windows PowerShell makes it easy to transition from typing commands interactively to creating and running scripts.Можно ввести команды в командной строке Windows PowerShell, чтобы найти команды, выполняющие какую-либо задачу.You can type commands at the Windows PowerShell command prompt to discover the commands that perform a task.Затем эти команды можно сохранить в записи или журнале, прежде чем скопировать их в файл для использования в качестве сценария.Then, you can save those commands in a transcript or a history before copying them to a file for use as a script.

rpilot62.ru