61 votes

Inclure des fichiers relatifs dans PowerShell

Je voudrais inclure des fichiers 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.

Y a-t-il un joli Comment inclure des scripts avec des chemins relatifs ?

120voto

chrischu Points 874

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

. "$PSScriptRoot\script.ps1"

1 votes

J'ai trouvé cela très utile pour le modèle Azure ARM VM CustomScriptExtension où je téléchargeais plusieurs fichiers à partir d'un conteneur blob de compte de stockage en utilisant le paramètre FileUris puis en appelant un fichier qui faisait référence aux autres fichiers. La documentation d'Azure n'est pas très utile pour déterminer les chemins relatifs des fichiers téléchargés. J'ai essayé de . .\path\to\script.ps1 qui fonctionne lorsque vous exécutez le script à partir de l'Explorateur Windows ou d'un terminal PS dans le même dossier, mais il échouait toujours lors du déploiement vers Azure. Cette réponse résout entièrement le problème.

29voto

Shay Levy Points 41404

Vous pouvez inclure le fichier dans la source (dot-source) :

. . \scriptA.ps1

Pour obtenir le chemin complet du script :

Resolve-Path . \scriptA.ps1

1 votes

La première partie le fait... mais Resolve-Path va vérifier le répertoire courant et votre chemin pour le fichier. Si votre répertoire script est dans votre chemin ($env:path), il le trouvera.

0 votes

Merci les gars, j'aurais dû mentionner l'emplacement de la cure.

0 votes

Ça a marché pour moi. Merci +1

21voto

Michael Sorens Points 9637

Le dot-sourcing est l'option la plus simple, bien qu'elle ne soit pas particulièrement jolie, comme nous l'avons déjà dit. Cependant, ce format rend les choses un peu plus propres :

$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 : le message original pourrait sembler impliquer de vouloir un chemin relatif à l'adresse de l'utilisateur. le répertoire de travail actuel ; en réalité, l'intention est d'être relatif à la le répertoire source du script actuel (comme l'indique l'exemple de code d'alex2k8). Ainsi, cela permet au script actuel d'accéder à d'autres script du même référentiel.

8voto

JaredPar Points 333733

Malheureusement non, il n'y a pas de bon moyen. PowerShell ne supporte pas vraiment cette idée dans la V1. L'approche que vous adoptez est vraiment la meilleure.

0 votes

Et qu'en est-il de la v2 ? Dois-je utiliser les Modules pour les scripts externes et la syntaxe "Import-Module ./foo.psm1" ? Ou des améliorations pour l'inclusion habituelle de scripts ?

0 votes

@alex2k8, je n'ai pas encore beaucoup travaillé avec la V2 donc je ne peux pas trop vous aider. Je sais que les modules sont censés être beaucoup plus isolés que les scripts mais à part ça, je n'ai pas beaucoup de données.

0 votes

Dans la v2, vous pouvez utiliser un module avec un manifeste qui définit tous les modules, scripts, et même les snapins/assemblages. Un avantage agréable de ceci est que vous pouvez avoir des fonctions et des variables qui sont privées au module.

6voto

Ralph Willgoss Points 3452

À partir de la V2 (native à partir de Win7/2008R2 ; voir $psversiontable.psversion ), vous pouvez facilement inclure un fichier comme celui-ci :

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

Référence :
Comment réutiliser les fonctions Windows powershell dans les scripts ?

7 votes

Pour autant que je puisse dire, le problème avec ceci est que la ligne point-source est évaluée par rapport au répertoire de travail actuel, plutôt que par rapport au script qui contient la ligne point-source. Ainsi, si vous cd dans le répertoire qui contient le script d'abord ça marche, mais si vous l'appelez depuis un autre répertoire ça ne marche pas.

0 votes

C'est probablement à dessein, mais merci pour le commentaire, mon pote !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X