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?
Vous devez vous connecter pour publier un commentaire.
PowerShell 3+
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:
Split-Path
utilisé pour ici?Split-Path
est utilisé avec le-Parent
paramètre pour revenir au répertoire courant sans le script en cours d'exécution du nom.Si vous êtes à la création d'un V2 Module, vous pouvez utiliser une variable automatique appelé
$PSScriptRoot
.De PS > Aider automatic_variable
$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:
Split-Path -Parent $PSCommandPath
fait la job, merciPeut-ê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, ouGet-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 } $hello = "hello" Write-Host (Get-Script-Directory) Write-Host $hello
Enregistrer et exécuter à partir d'un autre répertoire. Vous allez montrer le chemin vers le script.Pour Powershell 3+
J'ai placé cette fonction dans mon profil. Travaille dans ISE à l'aide de la touche F8/Exécuter Sélection de trop.
Très similaire à déjà posté des réponses, mais de la tuyauterie semble plus PS-comme.
- Je utiliser le variable automatique $ExecutionContext, il travaille à partir de PowerShell 2 et plus tard.
J'ai besoin de savoir le nom du script et où il est en cours d'exécution à partir d'.
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.
ParameterArgumentValidationErrorNullNotAllowed
exception.M'a fallu un certain temps pour développer quelque chose qui a pris la accepté de répondre et l'a transformé en un solide fonction.
Ne savez pas sur les autres, mais je travaille dans un environnement avec des machines sur les deux PowerShell version 2 et 3 j'ai donc besoin de gérer à la fois. La fonction suivante offre un gracieux de secours:
Cela signifie également que la fonction renvoie le Script de la portée que la mère de la portée de l'énoncé par Michael Sorens dans son blog
J'utilise toujours ce petit extrait de code qui fonctionne pour Powershell ISE de la même façon:
Vous pouvez également envisager
split-path -parent $psISE.CurrentFile.Fullpath
si les autres méthodes échouent. En particulier, si vous exécutez un fichier à charger un tas de fonctions et ensuite de l'exécution de ces fonctions dans la société internationale d'ethnobiologie shell (ou si vous l'exécutez-sélectionné), il semble que leGet-Script-Directory
fonction comme ci-dessus ne fonctionne pas.$PSCommandPath
va travailler dans la société internationale d'ethnobiologie aussi longtemps que vous enregistrez le script et exécutez le fichier en entier. Sinon, vous n'êtes pas en train d'exécuter un script; vous êtes juste à "coller" les commandes dans le shell.Constaté que les anciennes solutions postées ici ne fonctionne pas pour moi sur PowerShell V5. Je suis venu avec cette:
HTH