TUTOS.EU

Powershell - Trouver l'emplacement du script

Comment mettre l'emplacement du script dans une variable

Pour récupérer le chemin du répertoire qui contient le script, vous pouvez utiliser ce code.
Notez que pour que cela fonctionne, il faut que votre code soit dans un fichier.
Vous ne pouvez exécuter ce code directement dans une console.

$varCheminRepertoireScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
write-host $varCheminRepertoireScript
Lien vers le fichier : cliquez ici

Pour récupérer le chemin complet du script :

$varCheminDuScript = $MyInvocation.MyCommand.Definition
write-host $varCheminDuScript
Lien vers le fichier : cliquez ici

Exemple d'un script qui affiche les deux :

Pour historique, le script ci-dessous doit normalement retourner le chemin du répertoire qui contient le script en exécution. En réalité la technique n'est pas fiable et Powershell ne semble pas avoir prévu cet information avant (de mémoire) au moins la V3 : pas glop

#Version du 30 juillet 2014

Clear-Host
$MyLine = [string]
$NomFichierACreer = [string]

function Get-ScriptDirectory
{
	$Invocation = (Get-Variable MyInvocation -Scope 1).Value
	$ScriptFolderPath = Split-Path $Invocation.MyCommand.Path
	return $ScriptFolderPath
}

$NomFichierACreer = "MonFichier.txt"

$EmplacementFichier = Get-ScriptDirectory
$EmplacementFichier = "$EmplacementFichier\$NomFichierACreer"

#Création du fichier vierge
$MonFichier = New-Item -type file $EmplacementFichier -Force

$MyLine = "Ligne à écrire dans le fichier"
add-content $MonFichier $MyLine
Lien vers le fichier : cliquez ici

Une technique en mode plan B peut être de passer par ce bon vieux VbScript qui lui permet de le récupérer. Ensuite VbScript passe l'emplacement en tant que paramètre à Powershell.

Le VbScript

Option Explicit

Dim CheminScriptActuel, ScriptFileName, Position
Dim WSHShell, Commande
Dim objFSO, objTextFile, CheminFichierLog

'Déclaration des constantes
Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8

CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1)

ScriptFileName = wscript.scriptname
Position = InstrRev(ScriptFileName,".")
if (Position > 0) Then ScriptFileName = Left(ScriptFileName, Position - 1)

CheminFichierLog = CheminScriptActuel & "\" & ScriptFileName & "_log.txt"

Set WSHShell = CreateObject("WScript.Shell")

Commande = "cmd /k Powershell -file """ & CheminScriptActuel & "\" & ScriptFileName & ".ps1"" -path """& CheminScriptActuel & """"
msgbox Commande

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(CheminFichierLog, ForWritting, True)
objTextFile.WriteLine(Commande) 'On ecrit la date et l'heure dans le fichier
objTextFile.Close 'Fermeture du fichier

Set objTextFile = Nothing
Set objFSO = Nothing

WSHShell.Run Commande
Set WSHShell = Nothing
Lien vers le fichier : cliquez ici

Le powershell qui porte le même nom que le VbScript et qui est capable de récupérer l'emplacement en paramètre

Clear-Host

$global:varPath = ""

function main()  
{ 
	write-host "Ce script powershell est dans le répertoire $varPath"
}  

Function ParseCommand($oArgs){

	#Parses the command line and fills the script variables 
	#with the appropriate values.

	$ArgCount = 0
	if (!$oArgs.length -gt 0){
		write-host "No arguments specified."
	}

	While ($ArgCount -lt $oArgs.length){
		switch ($oArgs[$ArgCount].ToLower()){
			"-path"{
				$global:varPath = $oArgs[($ArgCount+1)]
				$ArgCount = ($ArgCount + 2)
				write-host "-path : $varPath"
				break
			}

			default{
				write-host "Invalid command."
#				Help
				exit			
			}
		}
	}
}

#Parse commands
ParseCommand($args)

## Run Main
main
Lien vers le fichier : cliquez ici