web-dev-qa-db-fra.com

Inclure les fichiers relatifs dans PowerShell

Je voudrais inclure des fichiers de script avec une telle pseudo syntaxe:

Include '.\scripA.ps1'

Mais la seule chose que j'ai trouvée est quelque chose comme ça:

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

c'est moche. 

Existe-t-il un moyen agréable d'inclure des scripts avec des chemins relatifs?

53
alex2k8

Malheureusement non, il n'y a pas de bonne façon. PowerShell ne supporte pas vraiment cette idée dans la V1. Vraiment l'approche que vous prenez est la meilleure approche

11
JaredPar

Vous pouvez utiliser le paramètre $ PSScriptRoot comme ceci:

. "$PSScriptRoot\script.ps1"
92
chrischu

Vous pouvez dot-source (inclure) le fichier:

. .\scriptA.ps1

Pour obtenir le chemin complet du script:

Resolve-Path.\ScriptA.ps1

28
Shay Levy

L’approvisionnement en points est l’option la plus simple, même si elle n’est pas particulièrement jolie, comme nous l’avons déjà indiqué. Cependant, ce format le rend juste un peu plus propre:

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

En outre, une note sur chemins relatifs qu'il est utile de rendre explicite: la publication originale peut sembler impliquer de vouloir un chemin relatif au répertoire de travail current; en réalité, l'intention est d'être relatif au répertoire source du script current (comme l'indique le propre exemple de code de alex2k8). Ainsi, cela permet au script actuel d'accéder à d'autres scripts à partir du même référentiel.

20
Michael Sorens

A partir de la V2 (natif commençant par Win7/2008R2; voir $psversiontable.psversion), vous pouvez facilement inclure un fichier comme suit:

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

Référence:
Comment réutiliser des fonctions windows powershell dans des scripts

5
Ralph Willgoss

Cela fonctionnerait probablement à partir de n’importe quel répertoire, mais ce sera une recherche sloooooowwwww si votre répertoire de départ n’est pas un répertoire directement antécédent du fichier que vous essayez d’inclure. IOW, si votre point de départ pour cette recherche est la racine de c:\ou une autre lettre de lecteur, celle-ci sera probablement terriblement lente.

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

Cela fonctionnera particulièrement bien si vous développez des scripts sur votre PC mais que vous devez les déployer sur un serveur qui va exécuter le script en tant que tâche planifiée.

0
Brian