Как получить текущий каталог выполняемого командлета - 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 ]

1 голос
/ 06 декабря 2013

Можно подумать, что использование «. \» В качестве пути означает, что это путь вызова.Но не все время.Пример, если вы используете его внутри задания ScriptBlock.В этом случае это может указывать на% profile% \ Documents.

0 голосов
/ 02 марта 2019

Для чего стоит быть единственной линией решения, ниже приведено рабочее решение для меня.

$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)

1 в конце игнорирует /.

благодаря сообщениям выше с использованием командлета Get-Location

0 голосов
/ 17 января 2016

Чтобы расширить ответ @Cradle: вы также можете написать многофункциональную функцию , которая даст вам тот же результат в ответ на вопрос ОП:

Function Get-AbsolutePath {

    [CmdletBinding()]
    Param(
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true
        )]
        [String]$relativePath=".\"
    )

    if (Test-Path -Path $relativePath) {
        return (Get-Item -Path $relativePath).FullName -replace "\\$", ""
    } else {
        Write-Error -Message "'$relativePath' is not a valid path" -ErrorId 1 -ErrorAction Stop
    }

}
...