2009-03-26 10 views
48

Je voudrais inclure des fichiers de script avec cette pseudo syntaxe:Inclure les fichiers relatifs à PowerShell

Include '.\scripA.ps1' 

Mais la seule chose que j'ai trouvé est quelque chose comme ceci:

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

qui est laid .

Y a-t-il un agréable façon d'inclure des scripts avec des chemins relatifs?

+2

PowerShell est moche – tofutim

Répondre

11

Malheureusement non, il n'y a pas de bon moyen. PowerShell ne supporte pas vraiment cette idée du tout en V1. Vraiment l'approche que vous prenez est la meilleure approche

+0

Et à propos de v2? Dois-je utiliser des modules pour les scripts externes et la syntaxe "Import-Module ./foo.psm1"? Ou des améliorations pour l'inclusion des scripts habituels? – alex2k8

+0

@ alex2k8, je n'ai pas encore beaucoup travaillé avec V2 et je ne peux pas donner trop d'aide.Je sais que les modules sont supposés être beaucoup plus isolés que les scripts mais à part ça je n'ai pas beaucoup de données. – JaredPar

+0

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

27

Vous pouvez-source point (inclure) le fichier:

. . \ ScriptA.ps1

Pour obtenir le chemin complet du script.

Resolve-Path \ scriptA.ps1

+0

Non, cela fonctionne jusqu'à ce que l'emplacement du script principal soit égal à pwd. – alex2k8

+1

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

+0

Les gars de Thnaks, j'aurais dû mentionner l'emplacement du cureent. –

20

Dot-sourcing est l'option la plus simple mais pas particulièrement jolie, comme déjà indiqué. Cependant, ce format rend juste un peu peu plus propre:

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

En outre, une note sur chemins relatifs qui est utile pour rendre explicite: le message original peut sembler impliquer vouloir un chemin par rapport au courant répertoire de travail; en réalité, l'intention est d'être relatif au répertoire source du script courant (comme l'indique le propre code d'alex2k8). Ainsi, cela permet au script en cours d'accéder à d'autres scripts du même référentiel.

4

A partir de V2 (natif à partir de Win7/2008R2, voir $psversiontable.psversion), vous pouvez facilement inclure un fichier comme ceci:

. "RelativeOrAbsolutePathToFile\include.ps1" 

$result = FunctionInIncludeFile() 

Référence:
How to reuse windows powershell functions in scripts

+6

Autant que je sache, le problème avec ceci est que la ligne de source de points est évaluée par rapport au répertoire de travail courant, plutôt que par rapport au script qui contient la ligne de source de points. Donc, si vous "cd" dans le répertoire qui contient le script, cela fonctionne, mais si vous l'appelez d'un autre répertoire, ce n'est pas le cas. –

+0

C'est probablement par conception, merci pour le commentaire si mate! –

71

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

. "$PSScriptRoot\script.ps1" 
+4

Ceci est la seule réponse qui fonctionne – Richard

+0

Solution assez propre qui fonctionne pour moi! – Omar

0

Cela fonctionnerait probablement à partir de n'importe quel répertoire, mais ce sera un slooo ooowwwww trouve si votre répertoire de départ n'est pas un répertoire antécédent direct 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, ce sera probablement horriblement lent.

. $ (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 une tâche planifiée.