Chaque fois que j'ai besoin de référencer un module ou un script commun, j'aime utiliser des chemins relatifs au fichier de script actuel. De cette façon, mon script peut toujours trouver d'autres scripts dans la bibliothèque.
Alors, quelle est la meilleure façon standard de déterminer le répertoire du script actuel? Actuellement, je fais:
$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
Je sais que dans les modules (.psm1), vous pouvez utiliser $PSScriptRoot
pour obtenir ces informations, mais cela n'est pas défini dans les scripts réguliers (c'est-à-dire les fichiers .ps1).
Quelle est la manière canonique d'obtenir l'emplacement du fichier de script PowerShell actuel?
powershell
powershell-2.0
Aaron Jensen
la source
la source
Réponses:
PowerShell 3+
PowerShell 2
Avant PowerShell 3, il n'y avait pas de meilleur moyen que d'interroger la
MyInvocation.MyCommand.Definition
propriété pour des scripts généraux. J'avais la ligne suivante en haut de pratiquement tous les scripts PowerShell que j'avais:la source
Split-Path
sert ici?Split-Path
est utilisé avec le-Parent
paramètre pour renvoyer le répertoire courant sans le nom du script en cours d'exécution.$PSScriptRoot
est (Split-Path -Parent
appliquée à)$MyInvocation.MyCommand.Path
, non$MyInvocation.MyCommand.Definition
, bien que dans la portée de niveau supérieur d'un script, ils se comportent de la même manière (qui est le seul endroit raisonnable à appeler à cet effet). Lorsqu'il est appelé à l'intérieur d'une fonction ou d' un bloc de script , le premier renvoie la chaîne vide, tandis que le second renvoie la définition du corps de fonction / bloc de script sous forme de chaîne (un morceau de code source PowerShell).Si vous créez un module V2, vous pouvez utiliser une variable automatique appelée
$PSScriptRoot
.Depuis PS> Aide automatic_variable
la source
$PSCommandPath Contains the full path and file name of the script that is being run. This variable is valid in all scripts.
Pour PowerShell 3.0
La fonction est alors:
la source
Pour PowerShell 3+
J'ai placé cette fonction dans mon profil. Il fonctionne également dans ISE en utilisant F8/ Run Selection.
la source
Peut-être que je manque quelque chose ici ... mais si vous voulez le répertoire de travail actuel, vous pouvez simplement l'utiliser:
(Get-Location).Path
pour une chaîne ouGet-Location
pour un objet.À moins que vous ne parliez de quelque chose comme ça, ce que je comprends après avoir relu la question.
la source
function Get-Script-Directory { $scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value return Split-Path $scriptInvocation.MyCommand.Path } $hello = "hello" Write-Host (Get-Script-Directory) Write-Host $hello
Enregistrez cela et exécutez-le à partir d'un répertoire différent. Vous allez montrer le chemin vers le script.Très similaire aux réponses déjà publiées, mais la tuyauterie semble plus proche de PowerShell:
la source
J'utilise la variable automatique
$ExecutionContext
. Cela fonctionnera à partir de PowerShell 2 et versions ultérieures.la source
Il m'a fallu un certain temps pour développer quelque chose qui prenait la réponse acceptée et en faisait une fonction robuste.
Je ne suis pas sûr des autres, mais je travaille dans un environnement avec des machines sur PowerShell version 2 et 3, donc j'avais besoin de gérer les deux. La fonction suivante offre une solution de rechange élégante:
Cela signifie également que la fonction fait référence à la portée du script plutôt qu'à la portée du parent comme indiqué par Michael Sorens dans l'un de ses articles de blog .
la source
J'avais besoin de connaître le nom du script et d'où il s'exécute.
Le préfixe «$ global:» à la structure MyInvocation renvoie le chemin d'accès complet et le nom du script lorsqu'il est appelé à la fois à partir du script principal et de la ligne principale d'un fichier de bibliothèque .PSM1 importé. Il fonctionne également à partir d'une fonction dans une bibliothèque importée.
Après avoir beaucoup tripoté, j'ai décidé d'utiliser $ global: MyInvocation.InvocationName. Il fonctionne de manière fiable avec le lancement de CMD, Run With Powershell et ISE. Les lancements locaux et UNC renvoient le chemin correct.
la source
ParameterArgumentValidationErrorNullNotAllowed
exception.J'utilise toujours ce petit extrait qui fonctionne pour PowerShell et ISE de la même manière:
la source
J'ai trouvé que les anciennes solutions publiées ici ne fonctionnaient pas pour moi sur PowerShell V5. Je suis venu avec ceci:
la source
Vous pouvez également considérer
split-path -parent $psISE.CurrentFile.Fullpath
si l'une des autres méthodes échoue. En particulier, si vous exécutez un fichier pour charger un tas de fonctions, puis exécutez ces fonctions dans le shell ISE (ou si vous exécutez-sélectionné), il semble que laGet-Script-Directory
fonction comme ci-dessus ne fonctionne pas.la source
$PSCommandPath
fonctionnera dans l'ISE tant que vous enregistrez d'abord le script et exécutez le fichier entier. Sinon, vous n'exécutez pas réellement un script; vous "collez" simplement des commandes dans le shell.En utilisant des morceaux de toutes ces réponses et des commentaires, j'ai mis cela ensemble pour quiconque verra cette question à l'avenir. Il couvre toutes les situations énumérées dans les autres réponses
la source
la source