J'ai un script PowerShell qui fait des choses en utilisant le répertoire actuel du script. Ainsi, à l'intérieur de ce répertoire, l'exécution .\script.ps1
fonctionne correctement.
Maintenant, je veux appeler ce script à partir d'un répertoire différent sans changer le répertoire de référence du script. Je veux donc appeler ..\..\dir\script.ps1
et je veux toujours que ce script se comporte comme il a été appelé depuis son répertoire.
Comment faire cela ou comment modifier un script pour qu'il puisse s'exécuter à partir de n'importe quel répertoire?
la source
ant
avec certains paramètres. Je dois donc appeler àant
partir de ce dossier pour m'assurer qu'il trouve correctement le fichier de configuration. Idéalement, je cherche quelque chose pour changer temporairement le répertoire d'exécution localement dans ce script.Push-Location
etPop-Location
Si vous appelez des applications natives, vous devez vous soucier
[Environment]::CurrentDirectory
du$PWD
répertoire actuel de PowerShell . Pour diverses raisons, PowerShell ne définit pas le répertoire de travail actuel du processus lorsque vous définissez un emplacement ou un emplacement push, vous devez donc vous assurer de le faire si vous exécutez des applications (ou applets de commande) qui s'attendent à ce qu'il soit défini.Dans un script, vous pouvez faire ceci:
Il n'y a pas d'alternative infaillible à cela. Beaucoup d'entre nous mettent une ligne dans notre fonction d'invite pour définir [Environment] :: CurrentDirectory ... mais cela ne vous aide pas lorsque vous changez l'emplacement dans un script.
Deux remarques sur la raison pour laquelle cela n'est pas défini automatiquement par PowerShell:
$PWD
répertoire de travail, mais il n'y a qu'un seul processus et un seul environnement.$PWD
n'est pas toujours un CurrentDirectory légal (vous pouvez CD dans le fournisseur de registre par exemple).Si vous souhaitez le placer dans votre invite (qui ne fonctionnerait que dans l'espace d'exécution principal, à un seul thread), vous devez utiliser:
la source
.\_/.
- pour cela a tué la moitié de ma journée! Les gens, sérieusement? Sérieusement? ..[Environment]::CurrentDirectory
lorsque cela diffère de$PWD
. La bonne chose à faire serait de la stocker dans une variable$origEnvDir = [Environment]::CurrentDirectory
, puis de la restaurer ultérieurement[Environment]::CurrentDirectory = $origEnvDir
.Il y a des réponses avec un grand nombre de votes, mais quand j'ai lu votre question, j'ai pensé que vous vouliez connaître le répertoire où se trouve le script, pas celui où le script s'exécute. Vous pouvez obtenir les informations avec les variables automatiques de PowerShell
Par exemple, j'ai un script $ profile qui trouve le fichier de solution de Visual Studio et le démarre. Je voulais stocker le chemin complet, une fois qu'un fichier de solution est démarré. Mais je voulais enregistrer le fichier où le script d'origine existe. J'ai donc utilisé $ PsScriptRoot.
la source
J'ai souvent utilisé le code suivant pour importer un module qui se trouve dans le même répertoire que le script en cours d'exécution. Il obtiendra d'abord le répertoire à partir duquel PowerShell s'exécute
la source
Cela fonctionnerait très bien.
la source
Pop-Location
à la fin pour ramener le chemin à son état d'origine.Eh bien, je cherchais une solution pour cela pendant un moment, sans aucun script uniquement de CLI. Voici comment je fais xD:
Accédez au dossier à partir duquel vous souhaitez exécuter le script (l'important est que vous ayez des onglets complets)
..\..\dir
Maintenant, entourez l'emplacement avec des guillemets doubles et ajoutez-y à l'intérieur
cd
, afin que nous puissions appeler une autre instance de PowerShell."cd ..\..\dir"
Ajoutez une autre commande pour exécuter le script séparée par
;
, avec un séparateur de commande dans PowerShell"cd ..\..\dir\; script.ps1"
Enfin, exécutez-le avec une autre instance de PowerShell
start powershell "cd..\..\dir\; script.ps1"
Cela va ouvrir une nouvelle fenêtre PowerShell, aller à
..\..\dir
, exécuterscript.ps1
et fermer la fenêtre.Notez que ";" sépare simplement les commandes, comme vous les avez tapées une par une, si la première échoue, la seconde s'exécutera et la suivante après, et la suivante après ... Si vous voulez garder une nouvelle fenêtre PowerShell ouverte, ajoutez -noexit dans la commande passée. Notez que je navigue d'abord vers le dossier souhaité pour pouvoir utiliser les complétions d'onglets (vous ne pouvez pas entre guillemets).
start powershell "-noexit cd..\..\dir\; script.ps1"
Utilisez des guillemets doubles
""
pour pouvoir passer des répertoires avec des espaces dans les noms, par exemple,start powershell "-noexit cd '..\..\my dir'; script.ps1"
la source
J'ai fait un one-liner avec la solution de @ JohnL:
la source