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