web-dev-qa-db-fra.com

Comment obtenir le fichier d'exécution actuel de PowerShell?

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?

74
Ron Klein

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
67
Lukas Kucera

Si vous voulez seulement le nom de fichier (pas le chemin complet), utilisez ceci:

$ScriptName = $MyInvocation.MyCommand.Name
66
Keith Hill

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 

32
JaredPar

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
7
Ryk

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)
6
MWR

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
4
Daddio

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

1
AntGut

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
1
Mark Crashley

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
0
unlikely