622 votes

Quelle est la meilleure façon de déterminer l'emplacement de l'actuel script PowerShell?

Chaque fois que j'ai besoin de faire référence à un module commun ou d'un script, j'aime utiliser des chemins relatifs à l'actuel fichier de script, de cette façon, mon script peut toujours trouver d'autres scripts dans la bibliothèque.

Alors, quel est le meilleur moyen standard, de déterminer le répertoire du script courant? Actuellement, je suis en train de faire:

$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

Je sais que dans les modules (.psm1), vous pouvez utiliser $PSScriptRoot , pour obtenir cette information, mais cela ne veut pas mettre régulièrement à des scripts (c'est à dire .fichiers ps1).

Quelle est la manière canonique pour obtenir le courant de script PowerShell emplacement du fichier?

1044voto

JaredPar Points 333733

PowerShell 3+

# This is an automatic variable set to the current file's/module's directory
$PSScriptRoot

PowerShell 2

Avant PowerShell 3, il n'y a pas de meilleur moyen que d'interroger l' MyInvocation.MyCommand.Definition propriété générale des scripts. J'ai eu l' ligne suivante en haut de chaque script powershell j'ai eu:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

71voto

Andy Schneider Points 4118

Si vous êtes à la création d'un V2 Module, vous pouvez utiliser une variable automatique appelé $PSScriptRoot.

De PS > Aide automatic_variable

$PSScriptRoot
 Contient le répertoire à partir duquel le module de script est en cours d'exécution.
 Cette variable permet à des scripts à utiliser le chemin d'accès du module pour accéder à d'autres
les ressources.

37voto

CodeMonkeyKing Points 1882

Pour PowerShell 3.0

$PSCommandPath
    Contains the full path and file name of the script that is being run. 
    This variable is valid in all scripts.

La fonction est alors:

function Get-ScriptDirectory {
    Split-Path -Parent $PSCommandPath
}

19voto

Sean C. Points 212

Peut-être que je suis absent quelque chose ici... mais si vous voulez le présent répertoire de travail, vous pouvez utiliser seulement ceci: (Get-Location).Path pour une chaîne de caractères, ou Get-Location pour un objet.

Sauf si vous faites allusion à quelque chose comme cela, que je comprends, après la lecture de la question à nouveau.

function Get-Script-Directory
{
    $scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value
    return Split-Path $scriptInvocation.MyCommand.Path
}

7voto

Bruce Gavin Points 39

J'ai besoin de savoir le nom du script et où il est en cours d'exécution.

Ajoutant le préfixe "$global:" à la MyInvocation structure renvoie le chemin d'accès complet et le nom du script lorsqu'il est appelé à partir à la fois le script principal, et la ligne principale d'un importés .PSM1 fichier de bibliothèque. Il travaille aussi à partir de l'intérieur d'une fonction dans un importés de la bibliothèque.

Après beaucoup de bidouiller, je me suis installé sur l'utilisation de $global:MyInvocation.InvocationName. Il fonctionne de manière fiable avec CMD lancer, Courir Avec Powershell, et de l'ISE. À la fois locale et UNC lance retourner le chemin d'accès correct.

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