242 votes

Comment obtenir le répertoire en cours de la cmdlet en cours d'exécution

Ce devrait être une tâche simple, mais j'ai vu plusieurs tentatives sur la façon d'obtenir le chemin d'accès au répertoire où l'applet de commande exécutée est situé, avec un succès mitigé. Par exemple, lorsque j'execute c:\temp\myscripts\mycmdlet.ps1 qui a un fichier de paramètres au c:\temp\myscripts\settings.xml je voudrais être en mesure de stocker c:\temp\myscripts dans une variable à l'intérieur de mycmdlet.ps1.

C'est une solution qui fonctionne (même si un peu lourd):

$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'

Un autre a suggéré cette solution qui fonctionne uniquement sur notre environnement de test:

$settingspath = '.\settings.xml'

J'aime la dernière approche beaucoup et préfèrent à avoir à analyser le chemin d'accès comme un paramètre à chaque fois, mais je ne peux pas le faire fonctionner sur mon environnement de développement. Quelqu'un aurait-il une idée de quoi faire? A-t-elle quelque chose à voir avec la façon dont PowerShell est configuré?

293voto

Cradle Points 180

Oui ça devrait marcher. Mais si vous avez besoin de voir le chemin absolu, c’est tout ce dont vous avez besoin:

 (Get-Item -Path ".\" -Verbose).FullName
 

184voto

JasonMArcher Points 4662

Le moyen fiable de procéder est comme vous l’avez montré $MyInvocation.MyCommand.Path .

L'utilisation de chemins d'accès relatifs sera basée sur $ pwd, dans PowerShell, le répertoire en cours d'une application ou le répertoire de travail en cours d'une API .NET.

92voto

Tony Sheen Points 1

La méthode la plus simple semble être d'utiliser la variable prédéfinie suivante, bien que je ne sois pas sûre qu'elle soit spécifique à la version:

  $PSScriptRoot
 

Je l'utilise comme ça:

  $MyFileName = "data.txt"
 $filebase = $PSScriptRoot + "\" + $MyFileName
 

33voto

user1545314 Points 111

Le chemin est souvent nul. Cette fonction est plus sûre.

 function Get-ScriptDirectory
{
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value;
    if($Invocation.PSScriptRoot)
    {
        $Invocation.PSScriptRoot;
    }
    Elseif($Invocation.MyCommand.Path)
    {
        Split-Path $Invocation.MyCommand.Path
    }
    else
    {
        $Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\"));
    }
}
 

1voto

Vous penseriez que l'utilisation de '. \' Comme chemin signifie qu'il s'agit du chemin d'appel. Mais pas tout le temps. Exemple, si vous l'utilisez dans un travail ScriptBlock. Dans ce cas, il pourrait pointer sur% profile% \ Documents.

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