Ответ 1
К сожалению нет, нет хорошего пути. PowerShell не очень хорошо поддерживает эту идею в V1. Действительно подход, который вы принимаете, - лучший подход
Я хотел бы включить script файлы с таким псевдосинтаксисом:
Include '.\scripA.ps1'
Но единственное, что я нашел, это что-то вроде этого:
$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')
что является уродливым.
Есть ли хороший способ включить скрипты с относительными путями?
К сожалению нет, нет хорошего пути. PowerShell не очень хорошо поддерживает эту идею в V1. Действительно подход, который вы принимаете, - лучший подход
Вы можете использовать параметр $PSScriptRoot следующим образом:
. "$PSScriptRoot\script.ps1"
Вы можете использовать dot-source (include) файл:
..\ScriptA.ps1
Чтобы получить полный путь к script:
Решить путь.\scriptA.ps1
Dot-sourcing - это самый простой вариант, хотя и не очень красивый, как уже было сказано. Однако этот формат делает его чуть более чистым:
$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)
Кроме того, примечание о относительных путях, которое полезно для явного: исходное сообщение может показаться желательным для пути относительно текущего рабочего каталога; в действительности намерение должно относиться к текущему исходному каталогу script (как показывает собственный пример кода alex2k8). Таким образом, это позволяет текущему script получить доступ к другим скриптам из одного и того же репозитория.
Начиная с V2 (нативная начиная с Win7/2008R2; см. $psversiontable.psversion
), вы можете легко включить файл, например, так:
. "RelativeOrAbsolutePathToFile\include.ps1"
$result = FunctionInIncludeFile()
Ссылка:
Как повторно использовать функции Windows PowerShell в сценариях
Это, вероятно, будет работать из любого каталога, но это будет sloooooowwwww найти, если ваш исходный каталог не является прямым антецедентом каталога файла, который вы пытаетесь включить. IOW, если отправной точкой для этого поиска является корень c:\или другой буквы диска, это, вероятно, будет ужасно медленным.
. $(Resolve-Path -literal $(gci -Recurse include.ps1))
Это будет работать особенно хорошо, если вы разрабатываете скрипты на своем ПК, но их нужно развернуть на сервер, который будет запускать script в качестве запланированной задачи.
Вы можете использовать $ PSScriptRoot и директиву Split-Path, чтобы она работала чисто для относительных путей.
. (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')