Comment obtenir le répertoire courant de l'applet de commande en cours d'exécution

StackOverflow https://stackoverflow.com/questions/8343767

  •  27-10-2019
  •  | 
  •  

Question

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

Ceci est une solution qui fonctionne (bien qu'un peu encombrant de):

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

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

$settingspath = '.\settings.xml'

Je aime cette dernière approche beaucoup et préfèrent à avoir à analyser le filepath comme paramètre à chaque fois, mais je ne peux pas le faire pour travailler sur mon environnement de développement. Que dois-je faire? At-il quelque chose à voir avec la façon dont PowerShell est configuré?

Était-ce utile?

La solution

La façon fiable de faire est tout comme vous montriez $MyInvocation.MyCommand.Path.

L'utilisation des chemins relatifs sera basée sur $ PWD, dans PowerShell, le répertoire en cours pour une application, ou le répertoire de travail en cours pour une API .NET.

PowerShell v3 + :

Utilisez le $PSScriptRoot variable automatique.

Autres conseils

Oui, cela devrait fonctionner. Mais si vous avez besoin de voir le chemin absolu, cela est tout ce que vous avez besoin:

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

La méthode la plus simple semble être d'utiliser la variable prédéfinie suivante:

 $PSScriptRoot

about_Automatic_Variables et about_Scripts à la fois l'état:

PowerShell 2.0, cette variable est valide uniquement dans les modules de script (.psm1). À partir de PowerShell 3.0, il est valable dans tous les scripts.

Je l'utilise comme ceci:

 $MyFileName = "data.txt"
 $filebase = Join-Path $PSScriptRoot $MyFileName

Vous pouvez également utiliser:

(Resolve-Path .\).Path

La partie entre parenthèses renvoie une PathInfo objet.

(Disponible depuis PowerShell 2.0.)

Path est souvent nulle. Cette fonction est plus sûr.

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("\"));
    }
}

Essayez:

(Get-Location).path

ou

($pwd).path

Get-Location renverra l'emplacement actuel:

$Currentlocation = Get-Location

Je la solution d'une ligne :)

$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent

Essayez ceci:

$WorkingDir = Convert-Path .

Dans Powershell 3 ci-dessus et vous pouvez simplement utiliser

$PSScriptRoot

On pourrait penser que l'utilisation «\ » comme le moyen de chemin qu'il est le chemin d'appel. Mais pas tout le temps. Par exemple, si vous l'utilisez dans un travail ScriptBlock. Dans ce cas, il pourrait pointer% Profil% \ Documents.

Pour ce que ça vaut, pour être une solution unique en ligne, le ci-dessous est une solution de travail pour moi.

$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)

1 à la fin est d'ignorer le /.

Merci aux postes ci-dessus en utilisant la

Pour développer la réponse de @Cradle: vous pouvez aussi écrire un fonction polyvalente que vous obtiendrez le même résultat par la question de l'OP:

Function Get-AbsolutePath {

    [CmdletBinding()]
    Param(
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true
        )]
        [String]$relativePath=".\"
    )

    if (Test-Path -Path $relativePath) {
        return (Get-Item -Path $relativePath).FullName -replace "\\$", ""
    } else {
        Write-Error -Message "'$relativePath' is not a valid path" -ErrorId 1 -ErrorAction Stop
    }

}

Si vous avez juste besoin le nom du répertoire courant, vous pouvez faire quelque chose comme ceci:

((Get-Location) | Get-Item).Name

En supposant que vous travaillez à partir de C: \ Temp \ Emplacement \ MyWorkingDirectory>

Sortie

MyWorkingDirectory

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top