Remarque: PowerShell 1.0
J'aimerais obtenir le nom du fichier en cours d’exécution de PowerShell. 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: "monfichier.ps1" est préférable.
Des idées?
Bien que la réponse actuelle soit correcte dans la plupart des cas, il existe certaines situations dans lesquelles cela ne vous donnera pas la réponse correcte. Si vous utilisez dans vos fonctions de script, alors:
$MyInvocation.MyCommand.Name
Renvoie le nom de la fonction à la place du nom du script.
function test {
$MyInvocation.MyCommand.Name
}
Te donnera "tester"peu importe comment votre script s'appelle . La bonne commande pour obtenir le nom du script est toujours
$MyInvocation.ScriptName
cela retourne le chemin complet du script que vous exécutez. Si vous avez uniquement besoin du nom de fichier du script, ce code devrait vous aider:
split-path $MyInvocation.PSCommandPath -Leaf
Si vous voulez seulement le nom de fichier (pas le chemin complet), utilisez ceci:
$ScriptName = $MyInvocation.MyCommand.Name
Essayez ce qui suit
$path = $MyInvocation.MyCommand.Definition
Cela ne vous donnera peut-être pas le chemin réel mais cela vous donnera un chemin valide pour le fichier
Si vous recherchez le répertoire actuel dans lequel le script est exécuté, vous pouvez essayer celui-ci:
$fullPathIncFileName = $MyInvocation.MyCommand.Definition
$currentScriptName = $MyInvocation.MyCommand.Name
$currentExecutingPath = $fullPathIncFileName.Replace($currentScriptName, "")
Write-Host $currentExecutingPath
attention: Contrairement aux variables automatiques $PSScriptRoot
et $PSCommandPath
, le Propriétés PSScriptRoot
et PSCommandPath
du $MyInvocation
automatic variable contient des informations sur l'appelant ou le script d'appel, pas le script actuel.
par exemple.
PS C:\Users\S_ms\OneDrive\Documents> C:\Users\SP_ms\OneDrive\Documents\DPM ...
=!C:\Users\S_ms\OneDrive\Documents\DPM.ps1
... où DPM.ps1
contient
Write-Host ("="+($MyInvocation.PSCommandPath)+"!"+$PSCommandPath)
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
function printme () {
"In function:"
( "MyInvocation.ScriptName: " + [string]($MyInvocation.ScriptName) )
( "script:MyInvocation.MyCommand.Name: " + [string]($script:MyInvocation.MyCommand.Name) )
( "MyInvocation.MyCommand.Name: " + [string]($MyInvocation.MyCommand.Name) )
}
"Main:"
( "MyInvocation.ScriptName: " + [string]($MyInvocation.ScriptName) )
( "script:MyInvocation.MyCommand.Name: " + [string]($script:MyInvocation.MyCommand.Name) )
( "MyInvocation.MyCommand.Name: " + [string]($MyInvocation.MyCommand.Name) )
" "
printme
exit
SORTIE:
PS> powershell C:\temp\test.ps1
Main:
MyInvocation.ScriptName:
script:MyInvocation.MyCommand.Name: test.ps1
MyInvocation.MyCommand.Name: test.ps1
In function:
MyInvocation.ScriptName: C:\temp\test.ps1
script:MyInvocation.MyCommand.Name: test.ps1
MyInvocation.MyCommand.Name: printme
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 d'accès complet lorsque la question demande uniquement le nom du script. La variable scoped fonctionne dans tous les lieux.
De plus, si vous voulez le chemin complet, appelez simplement:
$script:MyInvocation.MyCommand.Path
Comme indiqué dans les réponses précédentes, l'utilisation de "$ MonInvocation" 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 telles que le chemin du script, son nom, les paramètres, la ligne de commande, etc. Variable "sur" MyInvocation "...
# Get the MyInvocation variable at script level
# Can be done anywhere within a script
$ScriptInvocation = (Get-Variable MyInvocation -Scope Script).Value
# Get the full path to the script
$ScriptPath = $ScriptInvocation.MyCommand.Path
# Get the directory of the script
$ScriptDirectory = Split-Path $ScriptPath
# Get the script name
# Yes, could get via Split-Path, but this is "simpler" since this is the default return value
$ScriptName = $ScriptInvocation.MyCommand.Name
# Get the invocation path (relative to $PWD)
# @GregMac, this addresses your second point
$InvocationPath = ScriptInvocation.InvocationName
Donc, vous pouvez obtenir les mêmes informations que $ PSCommandPath, mais beaucoup plus dans la transaction. Pas sûr, mais on dirait que "Get-Variable" n'était pas disponible avant la PS3, donc beaucoup d'aide pour les systèmes très anciens (non mis à jour).
Il y a aussi des aspects intéressants à utiliser avec "-Scope" car vous pouvez revenir en arrière pour obtenir les noms, etc. de la (des) fonction (s) appelante (s). 0 = actuel, 1 = parent, etc.
J'espère que c'est un peu utile.
Réf., https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.utility/get-variable
Quelques tests avec le script suivant, sur PS 2 et PS 4, ont donné le même résultat. J'espère que cela aide les gens.
$PSVersionTable.PSVersion
function PSscript {
$PSscript = Get-Item $MyInvocation.ScriptName
Return $PSscript
}
""
$PSscript = PSscript
$PSscript.FullName
$PSscript.Name
$PSscript.BaseName
$PSscript.Extension
$PSscript.DirectoryName
""
$PSscript = Get-Item $MyInvocation.InvocationName
$PSscript.FullName
$PSscript.Name
$PSscript.BaseName
$PSscript.Extension
$PSscript.DirectoryName
Résultats -
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
C:\PSscripts\Untitled1.ps1
Untitled1.ps1
Untitled1
.ps1
C:\PSscripts
C:\PSscripts\Untitled1.ps1
Untitled1.ps1
Untitled1
.ps1
C:\PSscripts
Cela peut fonctionner sur la plupart des versions de PowerShell:
(& { $MyInvocation.ScriptName; })
Cela peut fonctionner pour un travail planifié
Get-ScheduledJob |? Name -Match 'JOBNAMETAG' |% Command