Comment obtenir le répertoire courant de l'applet de commande en cours d'exécution
-
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é?
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