Как получить текущий каталог выполняемого командлета

Это должна быть простая задача, но я видел несколько попыток получить путь к каталогу, в котором находится исполняемый командлет, с переменным успехом. Например, когда я выполняю 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?

195
задан Peter Mortensen 7 October 2019 в 01:14
поделиться

1 ответ

У меня были подобные проблемы, и это сделало меня большой проблемой, так как я делаю программы записанными в 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).

0
ответ дан 23 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: