Заметки о Windows и других программных продуктах Microsoft...

Как в скрипте PowerShell определить его местоположение

Как в скрипте PowerShell определить его местоположение

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

Так в переменной $PSScriptRoot хранится текущая директория, из которой был запущен скрипт, а в переменной $PSCommandPath — полный путь и имя файла скрипта. Для примера создадим скрипт такого содержания и выполним его:

″PSScriptRoot is $PSScriptRoot″
″PSCommandPath is $PSCommandPath″

Переменные $PSScriptRoot и $PSCommandPath

 

Также для определения местоположения можно воспользоваться переменной $MyInvocation. Эта переменная имеет свойство MyCommand, в котором содержатся сведения о выполняемой команде. Заменим содержимое скрипта и выполним его:

$MyInvocation.MyCommand | fl *

Свойство Mycommand переменной $MyInvocation

 

Примечание. Если попробовать получить значение переменных $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, которые как раз указывают на первый скрипт, из которого была запущена текущая команда.

особенности переменной $MyInvocation

 

Полный список автоматических переменных и их подробное описание можно получить командой about_Automatic_Variables.

 
 
Комментарии

Этих переменных нет, если скрипт исполнить из Доменной политики или Задания по расписанию.

Если запустить скрипт по расписанию, то путь до скрипта тут

$MyInvocation.Line | Split-Path -Parent

А если «руками», то в $MyInvocation.Line содержится:
if((Get-ExecutionPolicy ) -ne ‘AllSigned’) { Set-ExecutionPolicy -Scope Process Bypass }; & ‘и тут уже путь

Leave a Reply to Юрий