66 votes

Comment puis-je obtenir l'emplacement du système de fichiers d'un script PowerShell ?

J'ai un script PowerShell situé à l'adresse suivante D:\temp .

Lorsque je lance ce script, je veux que l'emplacement actuel du fichier soit listé. Comment dois-je m'y prendre ?

Par exemple, ce code le ferait dans un fichier batch DOS ; j'essaie de le convertir en un script PowerShell...

FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"

1 votes

J'ai juste une remarque à faire sur la façon dont vous procédez dans "DOS" (je suppose que dans ce siècle vous voulez dire Windows). Ne serait-il pas mieux de faire simplement : CD "%~dp0" ?

0 votes

Dans un shell cmd.exe, cela peut être fait en utilisant CD /D "%~dp0" .

142voto

Roman Kuzmin Points 13913

PowerShell 3+

Le chemin des scripts en cours d'exécution est le suivant :

$PSCommandPath

Son répertoire est le suivant :

$PSScriptRoot

PowerShell 2

Le chemin des scripts en cours d'exécution est le suivant :

$MyInvocation.MyCommand.Path

Son répertoire est le suivant :

$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent

2 votes

Faites attention en utilisant $PSSriptRoot . Il s'agit d'une variable prédéfinie dans un module.

0 votes

@Keith, en gros je suis d'accord que ce n'est pas une bonne idée de recommander $PSScriptRoot pour tout le monde. Au moins, il ne devrait pas être utilisé dans les scripts de production. J'ai juste copié/collé ceci de mon script "personnel". J'utilise exactement ce nom parce que c'est pratique : mon code utilise $PSScriptRoot partout : dans les modules (intégrés) et dans les scripts (faux).

0 votes

Quel est le danger potentiel d'utiliser ce nom dans les scripts ? Peut-être l'équipe PowerShell finira-t-elle par introduire $PSScriptRoot dans les scripts ordinaires également, et la variable sera, disons, en lecture seule. Alors oui, il y aura un problème dans mes scripts. Je devrai supprimer mon affectation de $PSScriptRoot de mon code (inconvénient). Mais le reste du code ne devra pas être mis à jour et il utilisera cette nouvelle fonctionnalité automatiquement (avantage).

10voto

stej Points 14257

Roman Kuzmin a répondu à la question, je pense. J'ajouterai simplement que si vous importez un module (par l'intermédiaire de Import-Module ), vous pouvez accéder à $PsScriptRoot variable automatique à l'intérieur du module - qui vous indiquera où se trouve le module.

0voto

Quantium Points 316

Pour ce que ça vaut, j'ai constaté que cela fonctionne pour moi sur PowerShell V5 dans les scripts et dans PowerShell ISE :

try {
    $scriptPath = $PSScriptRoot
    if (!$scriptPath)
    {
        if ($psISE)
        {
            $scriptPath = Split-Path -Parent -Path $psISE.CurrentFile.FullPath
        } else {
            Write-Host -ForegroundColor Red "Cannot resolve script file's path"
            exit 1
        }
    }
} catch {
    Write-Host -ForegroundColor Red "Caught Exception: $($Error[0].Exception.Message)"
    exit 2
}

Write-Host "Path: $scriptPath"

HTH

P.S. Inclus une gestion complète des erreurs. Adaptez-le à vos besoins, en conséquence.

0voto

40-Love Points 1333

Voici un exemple :

$ScriptRoot = ($ScriptRoot, "$PSScriptRoot" -ne $null)[0]
import-module $ScriptRoot\modules\sql-provider.psm1
Import-Module $ScriptRoot\modules\AD-lib.psm1 -Force

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X