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


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

Include '.\scripA.ps1'

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

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

это мерзко.

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

6   51  

6 ответов:

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

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

. "$PSScriptRoot\script.ps1"

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

. .\скрипта.пс1

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

Resolve-Path. \scriptA. ps1

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

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

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

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

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

ссылки:
как повторно использовать функции Windows powershell в скриптах

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

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

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