Remarque: PowerShell 1.0
Je voudrais obtenir le nom du fichier PowerShell en cours d'exécution. Autrement dit, si je commence ma session comme ceci:
powershell.exe .\myfile.ps1
Je voudrais obtenir la chaîne ". \ Myfile.ps1" (ou quelque chose comme ça). EDIT : "myfile.ps1" est préférable.
Des idées?
powershell
Ron Klein
la source
la source
Réponses:
J'ai essayé de résumer les différentes réponses ici, mises à jour pour PowerShell 5:
Si vous utilisez uniquement PowerShell 3 ou version ultérieure, utilisez
$PSCommandPath
Si vous souhaitez une compatibilité avec les anciennes versions, insérez la cale:
if ($PSCommandPath -eq $null) { function GetPSCommandPath() { return $MyInvocation.PSCommandPath; } $PSCommandPath = GetPSCommandPath; }
Cela ajoute
$PSCommandPath
s'il n'existe pas déjà.Le code de shim peut être exécuté n'importe où (au niveau supérieur ou à l'intérieur d'une fonction), bien que la
$PSCommandPath
variable soit soumise à des règles de portée normales (par exemple, si vous mettez le shim dans une fonction, la variable est portée à cette fonction uniquement).Détails
Il y a 4 méthodes différentes utilisées dans diverses réponses, j'ai donc écrit ce script pour démontrer chacune (plus
$PSCommandPath
):Production:
Remarques:
C:\
, mais le script réel l'estC:\Test\test.ps1
..\Test\test.ps1
)$PSCommandPath
est le seul moyen fiable, mais a été introduit dans PowerShell 3la source
$PSCommandPath
si l'héritage (WindowsXP) n'est pas requis.function PSCommandPath
) et une référence à la mauvaise fonction (Write-Host " * Direct: $PSCommandPath"; Write-Host " * Function: $(ScriptName)";
- ou est-ce que je néglige quelque chose d'évident?Bien que la réponse actuelle soit correcte dans la plupart des cas, dans certaines situations, elle ne vous donnera pas la bonne réponse. Si vous utilisez dans vos fonctions de script, alors:
Renvoie le nom de la fonction au lieu du nom du nom du script.
Vous donnera un " test " quel que soit le nom de votre script. La bonne commande pour obtenir le nom du script est toujours
cela renvoie le chemin complet du script que vous exécutez. Si vous n'avez besoin que du nom de fichier du script, ce code devrait vous aider:
la source
$MyInvocation.ScriptName
renvoie une chaîne vide pour moi, PS v3.0.$MyInvocation.ScriptName
ne fonctionne que depuis l'intérieur d'une fonction. Voir ma réponse ci-dessous .Si vous ne voulez que le nom du fichier (pas le chemin complet), utilisez ceci:
la source
Essayez ce qui suit
Cela peut ne pas vous donner le chemin réel saisi mais cela vous donnera un chemin valide vers le fichier.
la source
$path = Split-Path $MyInvocation.MyCommand.Definition -Parent
Si vous recherchez le répertoire courant dans lequel le script est exécuté, vous pouvez essayer celui-ci:
la source
C:\ilike.ps123\ke.ps1
, n'est-ce pas?Replace()
méthode remplace chaque occurrence de l'aiguille (pas seulement la dernière occurrence) et je l'ai également testée. Cependant, c'est une bonne idée de faire quelque chose comme la soustraction sur des chaînes.String.TrimEnd()
($currentExecutingPath = $fullPathIncFileName.TrimEnd($currentScriptName)
)? - Cela fonctionne correctement:"Ich bin Hamster".TrimEnd("ster")
retourneIch bin Ham
et"Ich bin Hamsterchen".TrimEnd("ster")
retourneIch bin Hamsterchen
(au lieu deIch bin Hamchen
) - Très bien!$currentScriptPath = $MyInvocation.MyCommand.Definition; $currentScriptName = $MyInvocation.MyCommand.Name; $currentScriptDir = $currentScriptPath.Substring(0,$currentScriptPath.IndexOf($currentScriptName));
attention: contrairement aux variables automatiques
$PSScriptRoot
et$PSCommandPath
, les propriétésPSScriptRoot
etPSCommandPath
de la$MyInvocation
variable automatique contiennent des informations sur l'appelant ou le script appelant, et non sur le script courant.par exemple
... où
DPM.ps1
contientla source
Je dirais qu'il existe une meilleure méthode, en définissant la portée de la variable $ MyInvocation.MyCommand.Path:
ex> $ script : MyInvocation.MyCommand.Name
Cette méthode fonctionne dans toutes les circonstances d'invocation:
EX: Somescript.ps1
PRODUCTION:
Notez que la réponse acceptée ci-dessus ne renvoie PAS de valeur lorsqu'elle est appelée depuis Main. Notez également que la réponse acceptée ci-dessus renvoie le chemin complet lorsque la question a demandé le nom du script uniquement. La variable de portée fonctionne dans tous les endroits.
De plus, si vous vouliez le chemin complet, vous appelleriez simplement:
la source
Comme indiqué dans les réponses précédentes, l'utilisation de "$ MyInvocation" est sujette à des problèmes de portée et ne fournit pas nécessairement des données cohérentes (valeur de retour par rapport à la valeur d'accès direct). J'ai trouvé que la méthode la plus "propre" (la plus cohérente) pour obtenir des informations de script comme le chemin du script, le nom, les paramètres, la ligne de commande, etc. quelle que soit la portée (dans les appels de fonction principaux ou ultérieurs / imbriqués) consiste à utiliser "Get- Variable "sur" MyInvocation "...
Ainsi, vous pouvez obtenir les mêmes informations que $ PSCommandPath, mais beaucoup plus dans l'accord. Pas sûr, mais il semble que "Get-Variable" n'était pas disponible avant la PS3 donc pas beaucoup d'aide pour les systèmes vraiment anciens (non mis à jour).
Il y a aussi des aspects intéressants lors de l'utilisation de "-Scope" car vous pouvez revenir en arrière pour obtenir les noms, etc. de la ou des fonctions appelantes. 0 = actuel, 1 = parent, etc.
J'espère que cela est quelque peu utile.
Réf, https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-variable
la source
J'ai fait quelques tests avec le script suivant, sur PS 2 et PS 4 et a eu le même résultat. J'espère que cela aide les gens.
Résultats -
la source
Cela peut fonctionner sur la plupart des versions PowerShell:
Cela peut fonctionner pour le travail planifié
la source