У меня были аналогичные проблемы, и это доставляло мне много проблем, поскольку я делаю программы, написанные на 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
, а .
возвращает один из этих двух каталогов в зависимости от ситуации, что нелепо.
Но чтобы избежать всей этой суеты и использования сценария вызова, вы можете просто использовать $PWD
или $PSSCRIPTROOT
вместо .
для представления текущего каталога в зависимости от погоды, в которой вы хотите представить текущий рабочий каталог или каталог, из которого был вызван сценарий. И если вы по какой-то причине хотите получить другой из двух каталогов, которые возвращает .
, вы можете использовать $HOME
.
Лично у меня просто есть скрипт вызова внутри корневого каталога моих приложений, которые я разрабатываю с помощью PowerShell, который вызывает мой основной скрипт приложения, и просто не забываю никогда не менять текущий рабочий каталог в моем исходном коде моего приложения, поэтому мне никогда не придется об этом беспокоиться, и я могу использовать .
для представления текущего каталога и поддержки относительной адресации файлов в моих приложениях без каких-либо проблем. Это должно работать в более новых версиях PowerShell (новее версии 2).
person
SYOB SYOT
schedule
03.11.2019