leaf getdirectoryname from basename powershell include relative-path

getdirectoryname - Incluir archivos relativos en PowerShell



powershell path leaf (6)

A partir de V2 (nativo a partir de Win7 / 2008R2, consulte $psversiontable.psversion ) puede incluir fácilmente un archivo como este:

. "RelativeOrAbsolutePathToFile/include.ps1" $result = FunctionInIncludeFile()

Referencia:
Cómo reutilizar las funciones de Windows powershell en scripts

Me gustaría incluir archivos de script con dicha pseudo sintaxis:

Include ''./scripA.ps1''

Pero lo único que he encontrado es algo como esto:

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

eso es feo

¿Hay alguna buena manera de incluir scripts con rutas relativas?


Desafortunadamente no, no hay una buena manera. PowerShell realmente no es compatible con esta idea en absoluto en V1. Realmente el enfoque que estás tomando es el mejor enfoque


Dot-sourcing es la opción más simple aunque no particularmente bonita, como ya se dijo. Sin embargo, este formato lo hace un poco más limpio:

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

Además, una nota sobre rutas relativas que es útil para hacer explícita: la publicación original puede parecer que implica querer una ruta relativa al directorio de trabajo actual ; en realidad, la intención es ser relativa al directorio de origen del guión actual (como indica el propio código de muestra de alex2k8). Por lo tanto, esto permite que el script actual acceda a otros scripts desde el mismo repositorio.


Probablemente esto funcionaría desde cualquier directorio, pero será un error encontrar si su directorio inicial no es un directorio de antecedente directo del archivo que intenta incluir. IOW, si su punto de partida para esta búsqueda es la raíz de c: / o alguna otra letra de unidad, esto probablemente será terriblemente lento.

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

Esto funcionará especialmente bien si está desarrollando scripts en su PC pero necesita implementarlos en un servidor que ejecutará el script como una tarea programada.


Puede dot-source (incluir) el archivo:

. . / scriptA.ps1

Para obtener la ruta completa del script:

Resolve-Path. / ScriptA.ps1


Puede utilizar el parámetro $ PSScriptRoot de esta manera:

. "$PSScriptRoot/script.ps1"