Это должна быть простая задача, но я видел несколько попыток получить путь к каталогу, в котором находится исполняемый командлет, с переменным успехом. Например, когда я выполняю 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'
Мне очень нравится последний подход, и я предпочитаю его анализировать filepath в качестве параметра каждый раз, но я не могу заставить его работать в моей среде разработки. Что мне делать? Имеет ли это какое-то отношение к настройке PowerShell?
У меня были подобные проблемы, и это сделало меня большой проблемой, так как я делаю программы записанными в PowerShell (полные приложения GUI конечного пользователя), и у меня есть много файлов и ресурсов, которые я должен загрузить из диска. На основе моего опыта, с помощью .
для представления текущего каталога ненадежно. Это должно представить текущий рабочий каталог, но это часто не делает. Кажется, что 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
, и с [1 111] возврат одного из этих двух каталогов в зависимости от ситуации, что смешно.
, Но избегать всей этой суеты и использующий invoker сценарий, можно просто использовать или $PWD
или $PSSCRIPTROOT
вместо [1 114] для представления текущего каталога в зависимости от погоды, Вы хотите представить текущий рабочий каталог или каталог, из которого был вызван сценарий. И если Вы, по некоторым причинам, хотите получить другие из двух каталогов, которые .
возвраты, можно использовать $HOME
.
у меня лично просто есть invoker сценарий в корневом каталоге моих приложений, которые я разрабатываю с PowerShell, который вызывает мой сценарий главного приложения, и просто не забудьте никогда не изменять текущий рабочий каталог в моем исходном коде моего приложения, таким образом, я никогда не должен волноваться об этом, и я могу использовать .
, чтобы представить текущий каталог и поддерживать обращение файла прямого доступа в моих приложениях без любых проблем. Это должно работать в более новых версиях PowerShell (более новый, чем версия 2).