2009-03-26 16 views
48

me gustaría incluir archivos de comandos con tales seudo sintaxis:Incluir archivos relativos en PowerShell

Include '.\scripA.ps1' 

Pero la única cosa que he encontrado es algo como esto:

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

que es feo .

¿Hay alguna forma de agradable para incluir scripts con rutas relativas?

+2

PowerShell es feo – tofutim

Respuesta

11

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

+0

¿Y qué hay de v2? ¿Debo usar Módulos para scripts externos y sintaxis "Import-Module ./foo.psm1"? O cualquier mejora para la inclusión habitual de scripts? – alex2k8

+0

@ alex2k8, aún no he trabajado mucho con V2, así que no puedo brindar demasiada ayuda.Sé que se supone que los módulos están mucho más aislados que las secuencias de comandos, pero aparte de eso, no tengo demasiados datos. – JaredPar

+0

En v2, puede usar un módulo con un manifiesto que define todos los módulos, scripts e incluso snapins/assemblies. Un buen beneficio de esto es que puede tener funciones y variables que son privadas para el módulo. – JasonMArcher

27

Puede punto-fuente (incluir) el archivo:

. . \ ScriptA.ps1

para obtener la ruta completa de la secuencia de comandos:.

Resolve-Path \ scriptA.ps1

+0

No, esto funciona hasta que la ubicación del script principal sea igual a pwd. – alex2k8

+1

La primera parte lo hace ... pero Resolve-Path verificará el directorio actual y su ruta para el archivo. Si su directorio de scripts está en su ruta ($ env: ruta), lo encontrará. –

+0

Thnaks muchachos, debería haber mencionado la ubicación correcta. –

20

de puntos de abastecimiento es la opción más sencilla aunque no especialmente bonita, como ya se ha dicho. Sin embargo, este formato hace que sea sólo un poco 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 hacer explícita: el post original podría parecer implicar que desean una ruta relativa a la corriente directorio de trabajo; en realidad, la intención es ser relativa al directorio fuente del script actual (como lo indica el propio código del ejemplo de alex2k8). Por lo tanto, esto permite que el script actual acceda a otros scripts desde el mismo repositorio.

4

A partir de V2 (nativo a partir de Win7/2008R2; ver $psversiontable.psversion) se puede incluir fácilmente un archivo de este modo:

. "RelativeOrAbsolutePathToFile\include.ps1" 

$result = FunctionInIncludeFile() 

Referencia:
How to reuse windows powershell functions in scripts

+6

Hasta donde puedo decir, el problema con esto es que la línea de fuente de puntos se evalúa en relación con el directorio de trabajo actual, en lugar de en relación con el script que contiene la línea de fuente de puntos. Entonces, si 'cd' al directorio que contiene el script primero funciona, pero si lo llamas desde otro directorio no funciona. –

+0

Eso es probablemente por diseño, gracias por el comentario, amigo! –

71

puede utilizar el parámetro $ PSScriptRoot como este:

. "$PSScriptRoot\script.ps1" 
+4

Esta es la única respuesta que funciona – Richard

+0

¡Limpio suficiente solución que funciona para mí! – Omar

0

Esto probablemente funcionaría desde cualquier directorio, pero será un slooo ooowwwww encuentre si su directorio de inicio 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.

Cuestiones relacionadas