Получить местоположение скрипта powershell, опционально через символическую ссылку - PullRequest
1 голос
/ 18 апреля 2020

Множество людей задали и получили несколько вариантов ответов на вопрос «Как мне узнать путь к самому сценарию в Powershell?». Однако в моей ситуации у меня есть несколько служебных функций, хранящихся в общем модуле рядом со сценарием , но я на самом деле не запускаю сценарий из этого конкретного каталога , вместо этого у меня есть symlink'd сценарий к $ HOME \ bin, который у меня в PATH. И я не хочу использовать символическую ссылку на все библиотеки утилит в каталог $ HOME \ bin.

Как я могу получить путь к «реальному» пути сценария в Powershell, если скрипт действительно выполняется пользователем ( т.е. находится в PATH) может быть символическая ссылка?

1 Ответ

1 голос
/ 18 апреля 2020

Это немного неуклюже, но используйте общий $PSCommandPath, чтобы получить путь к сценарию, затем попытайтесь найти то, на что он ссылается. Если результата нет, то ответ $PSCommandPath. В противном случае проверьте, является ли это целевой путь абсолютной ссылки; если это так, то это ответ. В противном случае присоедините путь к символической ссылке с ее целью. Наконец, Resolve-Path используется для «удаления» относительной части объединенного пути.

Function Get-RealScriptPath() {
  # Get script path and name
  $ScriptPath = $PSCommandPath

  # Attempt to extract link target from script pathname
  $link_target = Get-Item $ScriptPath | Select-Object -ExpandProperty Target

  # If it's not a link ..
  If(-Not($link_target)) {
    # .. then the script path is the answer.
    return $ScriptPath
  }

  # If the link target is absolute ..
  $is_absolute = [System.IO.Path]::IsPathRooted($link_target)
  if($is_absolute) {
    # .. then it is the answer.
    return $link_target
  }

  # At this point:
  # - we know that script was launched from a link
  # - the link target is probably relative (depending on how accurate
  #   IsPathRooted() is).
  # Try to make an absolute path by merging the script directory and the link
  # target and then normalize it through Resolve-Path.
  $joined = Join-Path $PSScriptRoot $link_target
  $resolved = Resolve-Path -Path $joined
  return $resolved
}

Function Get-ScriptDirectory() {
  $ScriptPath = Get-RealScriptPath
  $ScriptDir = Split-Path -Parent $ScriptPath
  return $ScriptDir
}

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