Всякий раз, когда мне нужно сослаться на общий модуль или скрипт, мне нравится использовать пути относительно текущего файла скрипта. Таким образом, мой скрипт всегда может найти другие скрипты в библиотеке.
Итак, что является лучшим, стандартным способом определения каталога текущего скрипта? В настоящее время я занимаюсь:
$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
Я знаю, что в модулях (.psm1) вы можете использовать $PSScriptRoot
эту информацию, но она не устанавливается в обычных скриптах (то есть файлах .ps1).
Какой канонический способ узнать местонахождение текущего файла скрипта PowerShell?
powershell
powershell-2.0
Аарон Дженсен
источник
источник
Ответы:
PowerShell 3+
PowerShell 2
До PowerShell 3 не было лучшего способа, чем запросить
MyInvocation.MyCommand.Definition
свойство для общих сценариев. У меня была следующая строка вверху практически каждого скрипта PowerShell, который у меня был:источник
Split-Path
используется?Split-Path
используется с-Parent
параметром для возврата текущего каталога без имени текущего исполняемого скрипта.$PSScriptRoot
(Split-Path -Parent
применяется к)$MyInvocation.MyCommand.Path
, нет$MyInvocation.MyCommand.Definition
, хотя в области видимости сценария они ведут себя одинаково (что является единственным разумным местом для вызова с этой целью). При вызове внутри блока функции или скрипта первый возвращает пустую строку, тогда как последний возвращает определение блока функции / скрипта в виде строки (фрагмент исходного кода PowerShell).Если вы создаете модуль V2, вы можете использовать автоматическую переменную под названием
$PSScriptRoot
.Из PS> Помогите automatic_variable
источник
$PSCommandPath Contains the full path and file name of the script that is being run. This variable is valid in all scripts.
Для PowerShell 3.0
Функция тогда:
источник
Для PowerShell 3+
Я поместил эту функцию в своем профиле. Это работает в ISE, используя F8/ Run Selection тоже.
источник
Может быть, я что-то здесь упускаю ... но если вам нужен настоящий рабочий каталог, вы можете просто использовать это:
(Get-Location).Path
для строки илиGet-Location
для объекта.Если вы не имеете в виду нечто подобное, что я понимаю после прочтения вопроса снова.
источник
function Get-Script-Directory { $scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value return Split-Path $scriptInvocation.MyCommand.Path } $hello = "hello" Write-Host (Get-Script-Directory) Write-Host $hello
Сохраните его и запустите из другого каталога. Вы покажете путь к сценарию.Очень похоже на уже опубликованные ответы, но трубопровод выглядит более похожим на PowerShell:
источник
Я использую автоматическую переменную
$ExecutionContext
. Он будет работать с PowerShell 2 и более поздних версий.источник
Мне потребовалось некоторое время, чтобы разработать что-то, что приняло принятый ответ и превратило его в надежную функцию.
Я не уверен насчет других, но я работаю в среде с компьютерами как на PowerShell версии 2, так и на 3, поэтому мне нужно было справиться с обоими. Следующая функция предлагает изящный запасной вариант:
Это также означает, что функция ссылается на область действия скрипта, а не на область родителя, как обрисовано в общих чертах Майклом Соренсом в одной из его публикаций в блоге .
источник
Мне нужно было знать имя скрипта и откуда он выполняется.
Префикс $ global: к структуре MyInvocation возвращает полный путь и имя сценария при вызове как из основного сценария, так и из основной строки импортированного файла библиотеки .PSM1. Он также работает из функции в импортированной библиотеке.
После долгих раздумий я остановился на использовании $ global: MyInvocation.InvocationName. Он надежно работает с запуском CMD, Run With Powershell и ISE. И локальные, и UNC-запуски возвращают правильный путь.
источник
ParameterArgumentValidationErrorNullNotAllowed
исключение.Я всегда использую этот небольшой фрагмент, который работает для PowerShell и ISE одинаково:
источник
Я обнаружил, что старые решения, опубликованные здесь, не работают для меня на PowerShell V5. Я придумал это:
источник
Вы также можете рассмотреть,
split-path -parent $psISE.CurrentFile.Fullpath
если какой-либо из других методов потерпит неудачу. В частности, если вы запускаете файл для загрузки набора функций, а затем выполняете эти функции с помощью - в оболочке ISE (или если вы запускаете-selected), кажется, чтоGet-Script-Directory
функция, описанная выше, не работает.источник
$PSCommandPath
будет работать в ISE, пока вы сначала сохраните сценарий и выполните весь файл. В противном случае вы на самом деле не выполняете скрипт; вы просто «вставляете» команды в оболочку.Используя фрагменты всех этих ответов и комментариев, я собрал это для всех, кто увидит этот вопрос в будущем. Он охватывает все ситуации, перечисленные в других ответах
источник
источник