Каков наилучший способ определить местоположение текущего скрипта PowerShell? - PullRequest
463 голосов
/ 29 марта 2011

Всякий раз, когда мне нужно обратиться к общему модулю или сценарию, я предпочитаю использовать пути относительно текущего файла сценария, поэтому мой сценарий всегда может найти другие сценарии в библиотеке.

Итак, каков наилучший стандартный способ определения каталога текущего скрипта? В настоящее время я делаю:

$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

Я знаю, что в модулях (.psm1) вы можете использовать $PSScriptRoot для получения этой информации, но она не устанавливается в обычных скриптах (т.е. файлах .ps1).

Какой канонический способ получить текущее местоположение файла сценария PowerShell?

Ответы [ 13 ]

2 голосов
/ 03 апреля 2019

Обнаружено, что опубликованные здесь старые решения не работают для меня в PowerShell V5. Я придумал это:

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"

НТН

2 голосов
/ 30 января 2013

Вы могли бы также рассмотреть split-path -parent $psISE.CurrentFile.Fullpath, если любой из других методов потерпит неудачу.В частности, если вы запускаете файл для загрузки набора функций, а затем выполняете эти функции с помощью - в оболочке ISE (или если вы запускаете-selected), кажется, что функция Get-Script-Directory, как указано выше, не работает.

0 голосов
/ 28 апреля 2015
function func1() 
{
   $inv = (Get-Variable MyInvocation -Scope 1).Value
   #$inv.MyCommand | Format-List *   
   $Path1 = Split-Path $inv.scriptname
   Write-Host $Path1
}

function Main()
{
    func1
}

Main
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...