Включить относительные файлы в PowerShell - PullRequest
53 голосов
/ 26 марта 2009

Я хотел бы включить файлы сценариев с таким псевдосинтаксисом:

Include '.\scripA.ps1'

Но единственное, что я нашел, это что-то вроде этого:

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')

это безобразно.

Есть ли какой-нибудь хороший способ включить сценарии с относительными путями?

Ответы [ 6 ]

97 голосов
/ 26 ноября 2013

Вы можете использовать параметр $ PSScriptRoot следующим образом:

. "$PSScriptRoot\script.ps1"
29 голосов
/ 26 марта 2009

Вы можете использовать точечный источник (включить) файл:

. . \ ScriptA.ps1

Чтобы получить полный путь к скрипту:

Resolve-Path. \ ScriptA.ps1

20 голосов
/ 02 июня 2011

Dot-Sourcing - самый простой вариант, хотя и не очень красивый, как уже говорилось. Однако этот формат делает его немного чище:

$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)

Кроме того, примечание о относительных путях , которое полезно сделать явным: в оригинальном сообщении может показаться, что требуется путь относительно текущего рабочего каталога ; в действительности намерение должно быть относительно исходного каталога текущего скрипта (как показывает пример кода alex2k8). Таким образом, это позволяет текущему сценарию получать доступ к другим сценариям из того же хранилища.

11 голосов
/ 26 марта 2009

К сожалению нет, хорошего пути нет. PowerShell не очень хорошо поддерживает эту идею в V1. На самом деле подход, который вы выбираете, является лучшим подходом

6 голосов
/ 22 марта 2013

Начиная с V2 (начиная с Win7 / 2008R2; см. $psversiontable.psversion), вы можете легко включить файл, подобный следующему:

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

Справка:
Как повторно использовать функции Windows PowerShell в сценариях

0 голосов
/ 18 ноября 2017

Это, вероятно, сработает из любого каталога, но будет sloooooowwwww найти, если ваш начальный каталог не является прямым предшествующим каталогом файла, который вы пытаетесь включить. IOW, если отправной точкой для этого поиска является корень c: \ или какой-либо другой буквы диска, это, вероятно, будет ужасно медленным.

. $ (Resolve-Path -literal $ (gci -Recurse include.ps1))

Это будет особенно хорошо работать, если вы разрабатываете сценарии на своем ПК, но вам необходимо развернуть их на сервере, который будет запускать сценарий как запланированное задание.

...