Saya memiliki skrip PowerShell yang melakukan beberapa hal menggunakan direktori skrip saat ini. Jadi ketika di dalam direktori itu, menjalankan .\script.ps1
berfungsi dengan benar.
Sekarang saya ingin memanggil skrip itu dari direktori lain tanpa mengubah direktori referensi skrip. Jadi saya ingin menelepon ..\..\dir\script.ps1
dan masih ingin agar skrip itu berperilaku seperti yang dipanggil dari dalam direktori.
Bagaimana saya melakukan itu, atau bagaimana saya memodifikasi skrip sehingga dapat berjalan dari direktori mana pun?
sumber
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.Push-Location
danPop-Location
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:
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:
$PWD
direktori kerjanya sendiri , tetapi hanya ada satu proses, dan hanya satu Lingkungan.$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:
sumber
.\_/.
penulis naskah suci, AKU SANGAT kecewa - karena ini membunuh setengah dari hariku! Orang-orang, serius? Serius? ..[Environment]::CurrentDirectory
ketika itu berbeda$PWD
. Hal yang benar untuk dilakukan adalah menyimpannya ke dalam variabel$origEnvDir = [Environment]::CurrentDirectory
dan kemudian mengembalikannya[Environment]::CurrentDirectory = $origEnvDir
.Ada jawaban dengan jumlah suara besar, tetapi ketika saya membaca pertanyaan Anda, saya pikir Anda ingin tahu direktori di mana skrip berada, bukan di mana skrip berjalan. Anda bisa mendapatkan informasi dengan variabel otomatis PowerShell
Sebagai contoh, saya memiliki skrip $ profil yang menemukan file solusi visual studio dan memulainya. Saya ingin menyimpan path lengkap, setelah file solusi dimulai. Tapi saya ingin menyimpan file di mana skrip asli ada. Jadi saya menggunakan $ PsScriptRoot.
sumber
Saya sering menggunakan kode berikut untuk mengimpor modul yang duduk di bawah direktori yang sama dengan skrip yang sedang berjalan. Pertama-tama akan mendapatkan direktori dari mana PowerShell berjalan
sumber
Ini akan bekerja dengan baik.
sumber
Pop-Location
di akhir untuk mengembalikan jalur ke keadaan semula.Yah saya sedang mencari solusi untuk ini untuk sementara waktu, tanpa skrip hanya dari CLI. Ini adalah bagaimana saya melakukannya xD:
Arahkan ke folder dari mana Anda ingin menjalankan skrip (yang penting adalah Anda memiliki pelengkapan tab)
..\..\dir
Sekarang mengelilingi lokasi dengan tanda kutip ganda, dan di dalamnya menambahkan
cd
, sehingga kami bisa meminta contoh PowerShell lainnya."cd ..\..\dir"
Tambahkan perintah lain untuk menjalankan skrip yang dipisahkan oleh
;
, dengan adalah pemisah perintah di PowerShell"cd ..\..\dir\; script.ps1"
Akhirnya Jalankan dengan instance PowerShell lainnya
start powershell "cd..\..\dir\; script.ps1"
Ini akan membuka jendela powershell baru, pergi ke
..\..\dir
, jalankanscript.ps1
dan tutup jendela.Perhatikan bahwa ";" hanya memisahkan perintah, seperti Anda mengetiknya satu per satu, jika gagal pertama kedua akan berjalan dan berikutnya, dan berikutnya setelah ... Jika Anda ingin membuka jendela PowerShell baru Anda menambahkan -noexit dalam perintah yang dikirimkan. Perhatikan bahwa saya pertama-tama menavigasi ke folder yang diinginkan sehingga saya dapat menggunakan pelengkapan tab (Anda tidak bisa menggunakan tanda kutip ganda).
start powershell "-noexit cd..\..\dir\; script.ps1"
Gunakan tanda kutip ganda
""
sehingga Anda dapat melewati direktori dengan spasi dalam nama misalnya,start powershell "-noexit cd '..\..\my dir'; script.ps1"
sumber
Saya membuat one-liner dari solusi @ JohnL:
sumber