Jika Anda memanggil aplikasi asli, Anda perlu khawatir [Environment]::CurrentDirectory
bukan tentang $PWD
direktori PowerShell saat ini. Karena berbagai alasan, PowerShell tidak mengatur direktori kerja saat ini saat Anda mengatur-Lokasi atau Lokasi-Push, jadi Anda perlu memastikan Anda melakukannya jika Anda menjalankan aplikasi (atau cmdlet) yang mengharapkannya diatur.
Dalam skrip, Anda dapat melakukan ini:
$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
Tidak ada alternatif lain untuk ini. Banyak dari kita meletakkan garis dalam fungsi prompt kita untuk mengatur [Lingkungan] :: CurrentDirectory ... tetapi itu tidak membantu Anda ketika Anda mengubah lokasi dalam skrip.
Dua catatan tentang alasan mengapa ini tidak diatur oleh PowerShell secara otomatis:
- PowerShell bisa multi-berulir. Anda dapat memiliki beberapa Runspace (lihat RunspacePool, dan modul PSThreadJob) yang berjalan secara bersamaan dalam satu proses tunggal. Setiap runspace memiliki
$PWD
direktori kerjanya sendiri , tetapi hanya ada satu proses, dan hanya satu Lingkungan.
- Bahkan ketika Anda menggunakan utas tunggal,
$PWD
tidak selalu direktori arus yang sah (misalnya, Anda dapat memasukkan CD ke penyedia registri).
Jika Anda ingin memasukkannya ke prompt Anda (yang hanya akan berjalan di runspace utama, single-threaded), Anda perlu menggunakan:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
ant
dengan beberapa parameter. Jadi saya harus meneleponant
dari folder itu untuk memastikan bahwa ia menemukan file konfigurasi dengan benar. Idealnya saya mencari sesuatu untuk sementara mengubah direktori eksekusi secara lokal di dalam skrip itu.