Предположим, что в скрипте требуется определить текущие параметры, такие как имя файла или директория, из которой скрипт был запущен. Сделать это можно разными способами, но проще всего воспользоваться автоматическими переменными, в которых хранятся сведения о состоянии PowerShell.
Так в переменной $PSScriptRoot хранится текущая директория, из которой был запущен скрипт, а в переменной $PSCommandPath — полный путь и имя файла скрипта. Для примера создадим скрипт такого содержания и выполним его:
″PSScriptRoot is $PSScriptRoot″
″PSCommandPath is $PSCommandPath″
Также для определения местоположения можно воспользоваться переменной $MyInvocation. Эта переменная имеет свойство MyCommand, в котором содержатся сведения о выполняемой команде. Заменим содержимое скрипта и выполним его:
$MyInvocation.MyCommand | fl *
Примечание. Если попробовать получить значение переменных $PSScriptRoot, $PSCommandPath и $MyInvocation из консоли, то вы ничего не получите. Эти переменные заполняются только для скриптов и функций.
Таким образом, $MyInvocation.MyCommand.Path содержит полный путь и имя скрипта, $MyInvocation.MyCommand.Name — имя файла. Ну а текущую директорию можно получить командой:
$MyInvocation.MyCommand.Path | Split-Path -Parent
Для примера добавим в скрипт следующие команды и выполним его:
Full name is $($MyInvocation.MyCommand.Path)
Name is $($MyInvocation.MyCommand.Name)
Current directory is $($MyInvocation.MyCommand.Path | Split-Path -Parent)
Переменная $MyInvocation имеет одну особенность, о которой надо помнить. Для наглядности создадим два скрипта, первый:
$MyInvocation | fl *
.\script2.ps1
и второй:
$MyInvocation | fl *
Т.е. в первом скрипте мы выводим содержимое переменной $MyInvocation, затем из него же вызываем второй скрипт, в котором также выводим $MyInvocation. Запускаем первый скрипт и смотрим результат. Как видите, содержимое переменной для первого и второго скрипта отличается. Дело в том, что в $MyInvocation хранятся данные о вызывающем объекте, поэтому для второго скрипта оказались заполненными свойства ScriptName, PSScriptRoot и PSCommandPath, которые как раз указывают на первый скрипт, из которого была запущена текущая команда.
Полный список автоматических переменных и их подробное описание можно получить командой about_Automatic_Variables.
Этих переменных нет, если скрипт исполнить из Доменной политики или Задания по расписанию.