Подтвердить что ты не робот

Включить относительные файлы в PowerShell

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

Include '.\scripA.ps1'

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

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

что является уродливым.

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

4b9b3361

Ответ 1

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

Ответ 2

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

. "$PSScriptRoot\script.ps1"

Ответ 3

Вы можете использовать dot-source (include) файл:

..\ScriptA.ps1

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

Решить путь.\scriptA.ps1

Ответ 4

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

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

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

Ответ 6

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

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

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

Ответ 7

Вы можете использовать $ PSScriptRoot и директиву Split-Path, чтобы она работала чисто для относительных путей. . (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')