Это должно быть простой задачей, но я видел несколько попыток получить путь к каталогу, в котором исполняемый командлет находится с переменным успехом. Например, когда я выполняю 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?
powershell
cmdlet
Стиг Перес
источник
источник
Ответы:
Надежный способ сделать это, как вы показали
$MyInvocation.MyCommand.Path
.Использование относительных путей будет основано на $ pwd в PowerShell, текущем каталоге для приложения или текущем рабочем каталоге для .NET API.
PowerShell v3 + :
Используйте автоматическую переменную
$PSScriptRoot
.источник
$PSScriptRoot
и$MyInvocation.MyCommand.Path
?Да, это должно работать. Но если вам нужно увидеть абсолютный путь, это все, что вам нужно:
источник
C:\mydir
, и я вызываю командуC:\dir1\dir2\dir3\mycmdlet.ps1
, то это разрешитC:\mydir
, а неC:\dir1\dir2\dir3
. Вызов нового исполняемого файла имеет ту же проблему, поскольку текущий каталог наследуется от родительского процесса.Кажется, самый простой способ - использовать следующую предопределенную переменную:
about_Automatic_Variables
иabout_Scripts
оба заявляют:Я использую это так:
источник
Вы также можете использовать:
Часть в скобках возвращает
PathInfo
объект.(Доступно с PowerShell 2.0.)
источник
C:\mydir
, и я вызываю командуC:\dir1\dir2\dir3\mycmdlet.ps1
, то это разрешитC:\mydir
, а неC:\dir1\dir2\dir3
. Вызов нового исполняемого файла имеет ту же проблему, поскольку текущий каталог наследуется от родительского процесса.Путь часто нулевой. Эта функция безопаснее.
источник
Пытаться :
или:
источник
$pwd
/$PWD
всякий раз, когда делаю длительный перерыв от powershell! Намного полезнее ИМО ...Get-Location
вернет текущее местоположение:источник
Мне нравится однострочное решение :)
источник
Попробуй это:
источник
В Powershell 3 и выше вы можете просто использовать
$PSScriptRoot
источник
Можно подумать, что использование «. \» В качестве пути означает, что это путь вызова. Но не все время. Пример, если вы используете его внутри задания ScriptBlock. В этом случае это может указывать на% profile% \ Documents.
источник
эта функция установит в строке приглашения путь к сценарию, имея дело с разным способом получения пути к сценарию между vscode, psise и pwd:
источник
Большинство ответов не работают при отладке в следующих средах разработки:
Потому что в тех
$PSScriptRoot
пусто иResolve-Path .\
(и аналогичных) приведет к неправильным путям.Ответ Freakydinde - единственный, который разрешает эти ситуации, поэтому я проголосовал за это, но я не думаю, что
Set-Location
в этом ответе действительно то , что нужно . Поэтому я исправил это и сделал код немного более понятным:источник
То, что стоит, чтобы быть однострочным решением, ниже является рабочим решением для меня.
1 в конце должен игнорировать
/
.Благодаря приведенным выше сообщениям с помощью командлета Get-Location .
источник
Чтобы расширить ответ @Cradle: вы также можете написать многоцелевую функцию, которая даст вам тот же результат в ответ на вопрос ОП:
источник
Если вам просто нужно имя текущего каталога, вы можете сделать что-то вроде этого:
Предполагая, что вы работаете с C: \ Temp \ Location \ MyWorkingDirectory>
Вывод
MyWorkingDirectory
источник
У меня были подобные проблемы, и это доставило мне много хлопот, так как я делаю программы, написанные на PowerShell (приложения с полным пользовательским интерфейсом), и у меня много файлов и ресурсов, которые мне нужно загрузить с диска. Из моего опыта использования
.
для представления текущего каталога ненадежно. Он должен представлять текущий рабочий каталог, но часто это не так. Похоже, что PowerShell сохраняет расположение, из которого был вызван PowerShell.
. Точнее говоря, при первом запуске PowerShell он запускается по умолчанию внутри вашего домашнего каталога пользователя. Обычно это каталог вашей учетной записи, что-то вродеC:\USERS\YOUR USER NAME
, После этого PowerShell меняет каталог на каталог, из которого вы его вызвали, или на каталог, в котором находится выполняемый скрипт, перед тем, как представить вам приглашение PowerShell или запустить скрипт. Но это происходит после того, как само приложение PowerShell изначально запускается в вашем домашнем пользовательском каталоге.И
.
представляет тот начальный каталог, внутри которого запускается PowerShell. Таким образом,.
представляет текущий каталог только в том случае, если вы вызвали PowerShell из требуемого каталога. Если вы позже измените каталог в коде PowerShell, изменение не будет отражаться внутри.
каждого случая. В некоторых случаях.
представляет текущий рабочий каталог, а в других каталог, из которого был вызван PowerShell (сам по себе, а не сценарий), что может привести к противоречивым результатам. По этой причине я использую скрипт invoker. PowerShell скрипт с одной командой внутри:POWERSHELL
. Это гарантирует, что PowerShell вызывается из требуемого каталога и, таким образом,.
представлять текущий каталог. Но это работает только в том случае, если вы не измените каталог позже в коде PowerShell. В случае сценария, я использую INVOKER скрипт , который похож на последнего я уже говорил, за исключением того, что содержит опцию Файл:POWERSHELL -FILE DRIVE:\PATH\SCRIPT NAME.PS1
. Это обеспечивает запуск PowerShell внутри текущего рабочего каталога.Простое нажатие на скрипт вызывает PowerShell из вашего домашнего пользовательского каталога независимо от того, где находится скрипт. Это приводит к тому, что текущим рабочим каталогом является каталог, в котором находится сценарий, а каталогом вызова PowerShell -
C:\USERS\YOUR USER NAME
и с.
возвратом одного из этих двух каталогов в зависимости от ситуации, что смешно.Но чтобы избежать всей этой суеты и использования сценария invoker, вы можете просто использовать один
$PWD
или$PSSCRIPTROOT
вместо.
представления текущего каталога в зависимости от того, какую погоду вы хотите представить текущий рабочий каталог или каталог, из которого был вызван сценарий. И если вы по какой-то причине хотите получить другие из двух каталогов, которые.
возвращаются, вы можете использовать$HOME
.Лично у меня просто есть скрипт invoker внутри корневого каталога моих приложений, который я разрабатываю с помощью PowerShell, который вызывает мой основной скрипт приложения, и просто не забываю никогда не менять текущий рабочий каталог внутри моего исходного кода моего приложения, поэтому мне никогда не придется беспокоиться об этом, и я могу использовать
.
для представления текущего каталога и для поддержки относительной адресации файлов в моих приложениях без каких-либо проблем. Это должно работать в более новых версиях PowerShell (новее версии 2).источник