TUTOS.EU

Powershell - Trouver l'emplacement du script

Comment mettre l'emplacement du script dans une variable

Avec la v3 de powershell, on a accès à de nouvelles commandes.

On trouve des détails sur
https://docs.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.2

Commande Résultat
$PSScriptRoot Emplacement du script actuel
$MyInvocation.MyCommand.Path Chemin complet du script
$PSCommandPath Chemin complet du script

Pour les versions plus anciennes, 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 Copier le code

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

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

Exemple d'un script qui affiche les deux :

Comme montré sur https://www.tutos.eu/3600
on peut manier les variables pour écrire dans un fichier situé dans le même répertoire que le script powershell

$varCheminRepertoireScript = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
$currentScriptName = $MyInvocation.MyCommand.Name #Récupération du nom du script en cours

#On ne prend que le nom du script sans l'extention. Pour cela on chercher la position d'un point en partant de la droite et on prend tout ce qui est à sa gauche
$currentScriptName = $currentScriptName.substring(0,$($currentScriptName.lastindexofany(".")))

#Création du fichier vierge
$EmplacementFichier = "$varCheminRepertoireScript\$($currentScriptName)_Log.txt"
$MonFichier = New-Item -type file $EmplacementFichier -Force

$MyLine = "Une ligne dans mon fichier de log"
add-content $MonFichier $MyLine
Lien vers le fichier : cliquez ici Copier le code

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 cette 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 Copier le code

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 Copier le code

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 Copier le code

2