Nếu bạn đang gọi các ứng dụng gốc, bạn cần lo lắng về việc [Environment]::CurrentDirectory
không phải về $PWD
thư mục hiện tại của PowerShell . Vì nhiều lý do, PowerShell không đặt thư mục làm việc hiện tại của quy trình khi bạn Đặt vị trí hoặc Vị trí đẩy, do đó bạn cần đảm bảo rằng bạn sẽ làm như vậy nếu bạn đang chạy các ứng dụng (hoặc lệnh ghép ngắn) mà nó sẽ được đặt.
Trong một kịch bản, bạn có thể làm điều này:
$CWD = [Environment]::CurrentDirectory
Push-Location $MyInvocation.MyCommand.Path
[Environment]::CurrentDirectory = $PWD
## Your script code calling a native executable
Pop-Location
# Consider whether you really want to set it back:
# What if another runspace has set it in-between calls?
[Environment]::CurrentDirectory = $CWD
Không có sự thay thế hoàn hảo cho điều này. Nhiều người trong chúng ta đặt một dòng trong chức năng nhắc nhở của mình để đặt [Môi trường] :: CurrentDirectory ... nhưng điều đó không giúp ích gì cho bạn khi bạn thay đổi vị trí trong tập lệnh.
Hai lưu ý về lý do tại sao điều này không được PowerShell đặt tự động:
- PowerShell có thể đa luồng. Bạn có thể có nhiều Runspaces (xem RunspacePool và mô-đun PSThreadJob) chạy đồng thời trong một quy trình. Mỗi runspace có
$PWD
thư mục làm việc hiện tại của riêng nó , nhưng chỉ có một quy trình và chỉ có một Môi trường.
- Ngay cả khi bạn là một luồng đơn,
$PWD
không phải lúc nào cũng là một CurrentDirector hợp pháp (chẳng hạn bạn có thể đưa CD vào nhà cung cấp đăng ký).
Nếu bạn muốn đặt nó vào dấu nhắc của mình (sẽ chỉ chạy trong không gian chính, luồng đơn), bạn cần sử dụng:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
ant
với một số tham số. Vì vậy, tôi phải gọiant
từ thư mục đó để đảm bảo rằng nó tìm thấy tệp cấu hình chính xác. Lý tưởng nhất là tôi đang tìm kiếm một cái gì đó để tạm thời thay đổi thư mục thực thi cục bộ trong tập lệnh đó.