Как получить текущий каталог выполняемого командлета - PullRequest
180 голосов
/ 01 декабря 2011

Это должно быть простой задачей, но я видел несколько попыток узнать, как получить путь к каталогу, где исполняемый командлет находится с переменным успехом. Например, когда я выполняю c:\temp\myscripts\mycmdlet.ps1 с файлом настроек на c:\temp\myscripts\settings.xml, я хотел бы иметь возможность хранить c:\temp\myscripts в переменной в mycmdlet.ps1.

Это одно решение, которое работает (хотя и немного громоздко):

$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'

Другой предложил это решение, которое работает только в нашей тестовой среде:

$settingspath = '.\settings.xml'

Мне очень нравится последний подход, и я предпочитаю его каждый раз анализировать путь к файлу в качестве параметра, но я не могу заставить его работать в моей среде разработки. У кого-нибудь есть предложения, что делать? Это как-то связано с настройкой PowerShell?

Ответы [ 13 ]

235 голосов
/ 17 апреля 2014

Да, это должно работать.Но если вам нужно увидеть абсолютный путь, это все, что вам нужно:

(Get-Item -Path ".\").FullName
116 голосов
/ 07 декабря 2011

Надежный способ сделать это, как вы показали $MyInvocation.MyCommand.Path.

Использование относительных путей будет основано на $ pwd, в PowerShell, текущем каталоге приложения или текущем рабочем каталоге для.NET API.

PowerShell v3 + :

Использовать автоматическую переменную $PSScriptRoot.

78 голосов
/ 24 сентября 2014

Кажется, что проще всего использовать следующую предопределенную переменную:

 $PSScriptRoot

about_Automatic_Variables и about_Scripts оба состояния:

В PowerShell 2.0 эта переменная действительна только в скриптовых модулях (.psm1).Начиная с PowerShell 3.0, он действителен во всех сценариях.

Я использую его так:

 $MyFileName = "data.txt"
 $filebase = Join-Path $PSScriptRoot $MyFileName
42 голосов
/ 27 мая 2015

Вы также можете использовать:

(Resolve-Path .\).Path

Часть в скобках возвращает объект PathInfo.

(Доступно с PowerShell 2.0.)

32 голосов
/ 23 октября 2013

Путь часто нулевой.Эта функция безопаснее.

function Get-ScriptDirectory
{
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value;
    if($Invocation.PSScriptRoot)
    {
        $Invocation.PSScriptRoot;
    }
    Elseif($Invocation.MyCommand.Path)
    {
        Split-Path $Invocation.MyCommand.Path
    }
    else
    {
        $Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\"));
    }
}
24 голосов
/ 10 января 2016

Попробуйте:

(Get-Location).path

или

($pwd).path
15 голосов
/ 09 марта 2017

Get-Location вернет текущее местоположение:

$Currentlocation=Get-Location
12 голосов
/ 17 декабря 2015

мне нравится одна строка решение :)

$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
9 голосов
/ 21 июня 2017

Попробуйте это:

$WorkingDir = Convert-Path .
3 голосов
/ 03 мая 2018

В Powershell 3 и выше вы можете просто использовать

$PSScriptRoot

...