PowerShell: Exécuter la commande à partir du répertoire du script

J’ai un script PowerShell qui fait des choses en utilisant le répertoire actuel du script. Donc, quand vous .\script.ps1 dans ce répertoire, exécutez .\script.ps1 fonctionne correctement.

Maintenant, je veux appeler ce script depuis un autre répertoire sans changer le répertoire de référence du script. Je veux donc appeler ..\..\dir\script.ps1 et vouloir toujours que ce script se comporte comme il a été appelé depuis son répertoire.

Comment puis-je le faire ou comment modifier un script pour qu’il puisse s’exécuter à partir de n’importe quel répertoire?

Voulez-vous dire que vous voulez le propre chemin du script afin que vous puissiez référencer un fichier à côté du script? Essaye ça:

 $scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath Write-host "My directory is $dir" 

Vous pouvez obtenir beaucoup d’informations depuis $ MyInvocation et ses propriétés.

Si vous souhaitez référencer un fichier dans le répertoire de travail en cours, vous pouvez utiliser Resolve-Path ou Get-ChildItem:

 $filepath = Resolve-Path "somefile.txt" 

EDIT (basé sur le commentaire de l’OP):

 # temporarily change to the correct folder Push-Location $folder # do stuff, call ant, etc # now back to previous directory Pop-Location 

Il y a probablement d’autres moyens de réaliser quelque chose de similaire en utilisant Invoke-Command.

Si vous appelez des applications natives, vous devez vous soucier de [Environment]::CurrentDirectory non du répertoire en cours de $PWD PowerShell. Pour certaines raisons qui m’échappent, PowerShell ne définit pas le répertoire de travail actuel du processus lorsque vous définissez l’emplacement ou le mode Push-Location . Vous devez donc vous assurer de le faire si vous exécutez des applications (ou des applets de commande). être réglé.

Dans un script, vous pouvez le faire:

 Push-Location $MyInvocation.MyCommand.Path [Environment]::CurrentDirectory = $PWD ## Your Script Code ... Pop-Location [Environment]::CurrentDirectory = $PWD 

Il n’y a pas d’alternative infaillible à cela. Beaucoup d’entre nous ont mis une ligne dans notre fonction d’invite pour définir [Environment] :: CurrentDirectory … mais cela ne vous aide pas lorsque vous modifiez l’emplacement dans un script.

Note finale: $PWD n’est pas toujours un CurrentDirectory légal (vous pouvez par exemple insérer le CD dans le fournisseur de registre), donc si vous voulez le mettre dans votre invite ou dans les fonctions d’encapsulation des applets de commande * -Location, vous devez utiliser :

 [Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem 

Il y a des réponses avec un grand nombre de votes, mais quand je lis votre question, je pensais que vous vouliez connaître le répertoire où se trouve le script, pas celui où le script est exécuté. Vous pouvez obtenir les informations avec les variables automatiques de powershell

 $PSScriptRoot - the directory where the script exists, not the target directory the script is running in $PSCommandPath - the full path of the script 

Par exemple, j’ai un script $ profile qui trouve le fichier de solution de studio visuel et le lance. 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 original existe. J’ai donc utilisé $ PsScriptRoot.

J’ai souvent utilisé le code suivant pour importer un module situé sous le même répertoire que le script en cours d’exécution. Il va d’abord obtenir le répertoire à partir duquel PowerShell est en cours d’exécution

$ currentPath = Split-Path ((Get-Variable MyInvocation -Scope 0) .Value) .MyCommand.Path

module d’importation “$ currentPath \ sqlps.ps1”

Eh bien, je cherchais une solution pour cela pendant un certain temps, sans aucun script venant de la CLI. Voici comment je le fais xD:

  • Naviguez jusqu’au dossier depuis lequel vous voulez exécuter le script (l’important est que vous ayez des complétions d’onglet)

    ..\..\dir

  • Maintenant, entourez l’emplacement avec des guillemets doubles, et à l’intérieur, ajoutez cd pour que nous puissions appeler une autre instance de powershell.

    "cd ..\..\dir"

  • Ajouter une autre commande pour exécuter le script séparé par ; , with est un séparateur de commandes dans powershell

    "cd ..\..\dir\; script.ps1"

  • Enfin, exécutez-le avec une autre instance de powershell

    start powershell "cd..\..\dir\; script.ps1"

Cela ouvrira une nouvelle fenêtre PowerShell, allez à ..\..\dir , exécutez script.ps1 et fermez la fenêtre.


Notez que “;” Il suffit de séparer les commandes, comme vous les avez saisies une par une, si la première échoue la deuxième s’exécutera et la suivante, et la suivante après … Si vous voulez garder la nouvelle fenêtre de 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’onglet (vous ne pouviez pas les mettre entre guillemets).

start powershell "-noexit cd..\..\dir\; script.ps1"

Utilisez des guillemets "" pour pouvoir passer des répertoires avec des espaces dans les noms, par exemple,

start powershell "-noexit cd '..\..\my dir'; script.ps1"

Cela fonctionnerait bien.

 Push-Location $PSScriptRoot Write-Host CurrentDirectory $CurDir