РАЗДЕЛ about_Scripts КРАТКОЕ ОПИСАНИЕ Описание написания и выполнения скриптов в Windows PowerShell. ПОЛНОЕ ОПИСАНИЕ Скрипт - это текстовый файл, содержащий одну или несколько команд Windows PowerShell. Файлы скриптов Windows PowerShell имеют расширение PS1. Написание скрипта позволяет сохранить команду для последующего использования и легко передать ее другим пользователям. Также очень важно то, что скрипты позволяют выполнять команды, просто вводя путь к скрипту и имя файла. Файлы скриптов могут содержать всего одну команду или длинный набор команд, сопоставимый по размеру с большими приложениями. В скриптах имеются дополнительные возможности, например, возможность использовать специальный комментарий #Requires, возможность использования параметров, поддержка разделов данных и поддержка цифровых подписей для обеспечения безопасности. Кроме того, для скриптов и любых функций внутри скриптов можно писать разделы справки. КАК НАПИСАТЬ СКРИПТ Скрипт может содержать любые допустимые команды Windows PowerShell, в том числе одиночные команды и команды, использующие конвейеры, функции и структуры управления, например, инструкции If и циклы For. Для написания скрипта нужно запустить текстовый редактор (например, Блокнот) или редактор скриптов, например, интегрированную среду скриптов Windows PowerShell (ISE). После этого ввести команды и сохранить их в файле с допустимым именем и расширением PS1. В следующем примере приведен простой скрипт, возвращающий список служб, запущенных в текущей системе, и сохранить его в файле журнала. Имя файла журнала определяется по текущей дате. $date = (get-date).dayofyear get-service | out-file "$date.log" Для создания этого скрипта нужно открыть текстовый редактор или редактор скриптов и ввести эти команды, а затем сохранить их в файле с именем ServiceLog.ps1. ВЫПОЛНЕНИЕ СКРИПТА Прежде чем выполнить скрипт, нужно изменить установленную по умолчанию политику исполнения Windows PowerShell. Установленная по умолчанию политика исполнения запрещает выполнение любых скриптов, в том числе скриптов, созданных на локальном компьютере. Дополнительные сведения см. в разделе about_Execution_ Policies. Для выполнения скрипта нужно ввести полное имя файла скрипта и полный путь к нему. Например, для выполнения скрипта ServicesLog из каталога C:\Scripts введите следующую команду: c:\scripts\ServicesLog.ps1 Для выполнения скрипта из текущего каталога нужно ввести путь к текущему каталогу или использовать точку для обозначения текущего каталога и обратную косую черту для обозначения пути (.\). Например, для выполнения скрипта ServicesLog.ps1 из локального каталога введите следующую команду: .\ServicesLog.ps1 Для обеспечения безопасности Windows PowerShell не выполняет скрипты при двойном щелчке значка скрипта в проводнике и при вводе имени скрипта без указания полного пути, даже если скрипт находится в текущем каталоге. Дополнительные сведения о выполнении команд и скриптов в Windows PowerShell см. в разделе about_Command_Precedence. УДАЛЕННОЕ ВЫПОЛНЕНИЕ СКРИПТОВ Для выполнения скрипта на удаленном компьютере нужно использовать параметр FilePath командлета Invoke-Command. В качестве значения параметра FilePath нужно ввести путь и имя файла скрипта. Скрипт должен располагаться на локальном компьютере или в каталоге, доступ к которому с локального компьютера открыт. Следующая команда выполняет скрипт ServicesLog.ps1 на удаленном компьютере Server01. invoke-command -computername Server01 -filepath C:\scripts\servicesLog.ps1 ПАРАМЕТРЫ В СКРИПТАХ Для определения параметров в скрипте нужно использовать инструкцию Param. Инструкция Param должна быть первой в скрипте, за исключением комментариев и инструкций #Requires. Параметры скриптов работают примерно так же, как и параметры функций. Значения параметров доступны всем командам скрипта. Все возможности параметров функций, в том числе атрибут Parameter и его именованные аргументы, также доступны в скриптах. При выполнении скриптов пользователи скрипта вводят параметры после имени скрипта. В следующем примере показан скрипт Test-Remote.ps1 с параметром ComputerName. Обе функции скрипта могут использовать значение параметра ComputerName. param ($ComputerName = $(throw "ComputerName parameter is required.")) function CanPing { $error.clear() $tmp = test-connection $computername -erroraction SilentlyContinue if (!$?) {write-host "Ping failed: $ComputerName."; return $false} else {write-host "Ping succeeded: $ComputerName"; return $true} } function CanRemote { $s = new-pssession $computername -erroraction SilentlyContinue if ($s -is [System.Management.Automation.Runspaces.PSSession]) {write-host "Remote test succeeded: $ComputerName."} else {write-host "Remote test failed: $ComputerName."} } if (CanPing $computername) {CanRemote $computername} Для выполнения этого скрипта нужно ввести имя параметра после имени файла скрипта. Пример: C:\PS> .\test-remote.ps1 -computername Server01 Ping succeeded: Server01 Remote test failed: Server01 Дополнительные сведения о выражении Param и параметрах функций см. в разделах about_Functions и about_Functions_Advanced_Parameters. СПРАВКА ДЛЯ СКРИПТОВ Командлет Get-Help позволяет получить справку для скриптов, а также для командлетов, поставщиков и функций. Чтобы получить справку для скрипта, введите Get-Help и укажите путь и имя файла скрипта. Если путь к скрипту указан в переменной среды Path, его можно не указывать. Например, для получения справки для скрипта ServicesLog.ps1 введите следующую команду: get-help C:\admin\scripts\ServicesLog.ps1 Справку для скрипта можно написать с помощью любого из следующих двух методов: -- Справка для скриптов на основе комментариев Темы справки создаются посредством использования в комментариях специальных ключевых слов. Для создания справки для скрипта на основе комментариев, комментарии нужно разместить в начале или в конце файла скрипта. Дополнительные сведения о справке на основе комментариев см. в разделе about_Comment_Based_Help. -- Справка для скриптов на основе XML Создайте раздел справки XML подобно тому, как это делается для командлетов. Справка на основе XML нужна в том случае, если разделы справки переводятся на различные языки. Для привязки скрипта к теме справки на основе XML нужно использовать ключевое слово комментария справки .ExternalHelp. Дополнительные сведения о ключевом слове ExternalHelp см. в разделе about_Comment_Based_Help. Дополнительные сведения о справке на основе XML см. в разделе "How to Write Cmdlet Help" (Как писать справку для командлетов) в библиотеке MSDN по адресу http://go.microsoft.com/fwlink/?LinkID=123415. ОБЛАСТЬ ДЕЙСТВИЯ СКРИПТА И ЗАПИСЬ С ПОМОЩЬЮ ТОЧЕК Каждый скрипт выполняется в своей области действия. Функции, переменные, псевдонимы и диски, создаваемые в скрипте, существуют только в области действия скрипта. Эти элементы и их значения недоступны в области, в которой запущен скрипт. Для выполнения скрипта в другой области можно указать ее при запуске (глобальную или локальную) или использовать запись с точками. Возможность записи с точками позволяет выполнить скрипт в текущей области вместо области скрипта. При выполнении скрипта с использованием записи с точками команды скрипта выполняются так, как если бы они вводились в командной строке. Функции, переменные, псевдонимы и диски, создаваемые скриптом, создаются в текущей области. После выполнения скрипта созданные элементы можно использовать, и их значения будут доступными в текущем сеансе. Для выполнения скрипта с использованием записи с точками нужно ввести точку (.) и пробел перед путем к скрипту. Пример: . C:\scripts\UtilityFunctions.ps1 -или- . .\UtilityFunctions.ps1 После выполнения скрипта UtilityFunctions функции и переменные, создаваемые скриптом, добавляются в текущую область. Например, скрипт UtilityFunctions.ps1 создает функцию New-Profile и переменную $ProfileName. #In UtilityFunctions.ps1 function New-Profile { Write-Host "Running New-Profile function" $profileName = split-path $profile -leaf if (test-path $profile) {write-error "There is already a $profileName profile on this computer."} else {new-item -type file -path $profile -force } } При выполнении скрипта UtilityFunctions.ps1 в собственной области функция New-Profile и переменная $ProfileName существуют только во время работы скрипта. После завершения работы скрипта функция и переменная удаляются, как показано в следующем примере. C:\PS> .\UtilityFunctions.ps1 C:\PS> New-Profile Условие "new-profile" не распознано как командлет, функция, выполняемая программа или файл скрипта. Проверьте условие и повторите попытку. В строке:1 знак:12 + new-profile <<<< + CategoryInfo : ObjectNotFound: (new-profile:String) [], + FullyQualifiedErrorId : CommandNotFoundException C:\PS> $profileName C:\PS> При выполнении скрипта с использованием записи с помощью точек скрипт создает функцию New-Profile и переменную $ProfileName в текущем сеансе в текущей области. После выполнения скрипта функцию New-Profile можно использовать в сеансе, как показано в следующем примере. C:\PS> . .\UtilityFunctions.ps1 C:\PS> New-Profile Directory: C:\Users\juneb\Documents\WindowsPowerShell Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 1/14/2009 3:08 PM 0 Microsoft.PowerShellISE_profile.ps1 C:\PS> $profileName Microsoft.PowerShellISE_profile.ps1 Дополнительные сведения об областях см. в разделе about_Scopes. СКРИПТЫ В МОДУЛЯХ Модуль представляет собой набор связанных ресурсов Windows PowerShell, который можно распространять в качестве единого целого. Модули можно использовать для организации скриптов, функций и других ресурсов. Также модули можно использовать для распространения кода и для получения кода из надежных источников. Скрипты можно добавлять в модули. Можно создавать модули скриптов, полностью или в основном состоящие из скрипта и вспомогательных ресурсов. Модуль скрипта представляет собой скрипт с в виде файла с расширением PSM1. Дополнительные сведения о модулях см. в разделе about_Modules. ДРУГИЕ ВОЗМОЖНОСТИ В СКРИПТАХ В Windows PowerShell имеется множество полезных средств, которые можно использовать в скриптах. #Requires Выражение #Requires можно использовать, чтобы скрипт не выполнялся без указанных модулей или оснасток или при отсутствии указанной версии Windows PowerShell. Дополнительные сведения см. в разделе about_Requires. $MyInvocation Автоматическая переменная $MyInvocation содержит информацию о текущей команде, в том числе о текущем скрипте. Эту переменную и ее свойства можно использовать для получения информации о скрипте во время его работы. Например, переменная $MyInvocation.MyCommand.Path содержит путь и имя файла скрипта. Разделы данных Ключевое слово Data можно использовать для разделения в скриптах данных и логики. Использование разделов данных также упрощает локализацию. Дополнительные сведения см. в разделах about_Data_Sections и about_Script_Localization. Подписание скриптов В скрипты можно добавлять цифровые подписи. В зависимости от политики исполнения цифровые подписи можно использовать для ограничения выполнения скриптов, которые могут содержать небезопасные команды. Дополнительные сведения см. в разделах about_Execution_Policies и about_Signing. СМ. ТАКЖЕ about_Command_Precedence about_Comment_Based_Help about_Execution_Policies about_Functions about_Modules about_Profiles about_Requires about_Scopes about_Script_Blocks about_Signing Invoke-Command