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?
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
Vous pouvez utiliser le paramètre $ PSScriptRoot comme ceci:
. "$PSScriptRoot\script.ps1"
Vous pouvez dot-source (inclure) le fichier:
. .\scriptA.ps1
Pour obtenir le chemin complet du script:
Resolve-Path.\ScriptA.ps1
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.
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
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.