Tôi gặp vấn đề tương tự và nó gây cho tôi rất nhiều rắc rối vì tôi đang tạo các chương trình được viết bằng PowerShell (ứng dụng GUI của người dùng cuối đầy đủ) và tôi có rất nhiều tệp và tài nguyên tôi cần tải từ đĩa. Từ kinh nghiệm của tôi, sử dụng .
để đại diện cho thư mục hiện tại là không đáng tin cậy. Nó nên đại diện cho thư mục làm việc hiện tại, nhưng nó thường không. Dường như PowerShell lưu vị trí mà PowerShell đã được gọi bên trong .
. Nói chính xác hơn, khi PowerShell được khởi động lần đầu tiên, nó sẽ bắt đầu, theo mặc định, trong thư mục người dùng gia đình của bạn. Đó thường là thư mục của tài khoản người dùng của bạn, đại loại nhưC:\USERS\YOUR USER NAME
. Sau đó, PowerShell thay đổi thư mục thành thư mục mà bạn đã gọi nó hoặc thư mục chứa tập lệnh mà bạn đang thực thi được đặt trước khi hiển thị cho bạn lời nhắc PowerShell hoặc chạy tập lệnh. Nhưng điều đó xảy ra sau khi ứng dụng PowerShell ban đầu bắt đầu trong thư mục người dùng gia đình của bạn.
Và .
đại diện cho thư mục ban đầu bên trong mà PowerShell bắt đầu. Vì vậy, .
chỉ đại diện cho thư mục hiện tại trong trường hợp nếu bạn đã gọi PowerShell từ thư mục mong muốn. Nếu sau này bạn thay đổi thư mục trong mã PowerShell, thay đổi dường như không được phản ánh bên .
trong mọi trường hợp. Trong một số trường hợp .
đại diện cho thư mục làm việc hiện tại và trong thư mục khác mà PowerShell (chính nó, không phải tập lệnh) đã được gọi, điều gì có thể dẫn đến kết quả không nhất quán. Vì lý do này, tôi sử dụng kịch bản invoker. Tập lệnh PowerShell với một lệnh duy nhất bên trong :
POWERSHELL
. Điều đó sẽ đảm bảo rằng PowerShell được gọi từ thư mục mong muốn và do đó thực hiện.
đại diện cho thư mục hiện tại. Nhưng nó chỉ hoạt động nếu bạn không thay đổi thư mục sau này trong mã PowerShell. Trong trường hợp tập lệnh, tôi sử dụng tập lệnh invoker tương tự tập lệnh cuối cùng tôi đã đề cập, ngoại trừ tập lệnh chứa tùy chọn tệp :
POWERSHELL -FILE DRIVE:\PATH\SCRIPT NAME.PS1
. Điều đó đảm bảo rằng PowerShell được khởi động trong thư mục làm việc hiện tại.
Chỉ cần nhấp vào tập lệnh sẽ gọi PowerShell từ thư mục người dùng gia đình của bạn cho dù tập lệnh được đặt ở đâu. Nó dẫn đến thư mục làm việc hiện tại là thư mục chứa tập lệnh, nhưng thư mục gọi PowerShell đang tồn tại C:\USERS\YOUR USER NAME
và .
trả về một trong hai thư mục này tùy thuộc vào tình huống, thật là vô lý.
Nhưng để tránh tất cả sự phiền phức này và sử dụng tập lệnh invoker, bạn chỉ cần sử dụng $PWD
hoặc $PSSCRIPTROOT
thay vì .
đại diện cho thư mục hiện tại tùy thuộc vào thời tiết bạn muốn đại diện cho thư mục làm việc hiện tại hoặc thư mục mà tập lệnh đã được gọi. Và nếu bạn, vì một số lý do, muốn lấy lại hai thư mục khác .
trả về, bạn có thể sử dụng $HOME
.
Cá nhân tôi chỉ có tập lệnh invoker bên trong thư mục gốc của ứng dụng mà tôi phát triển bằng PowerShell, nó gọi tập lệnh ứng dụng chính của tôi và chỉ cần nhớ là không bao giờ thay đổi thư mục làm việc hiện tại bên trong mã nguồn của ứng dụng, vì vậy tôi không bao giờ phải lo lắng về điều này, và tôi có thể sử dụng .
để thể hiện thư mục hiện tại và để hỗ trợ địa chỉ tệp tương đối trong các ứng dụng của mình mà không gặp vấn đề gì. Điều này sẽ hoạt động trong các phiên bản mới hơn của PowerShell (mới hơn phiên bản 2).