หากคุณกำลังเรียกใช้แอพที่ใช้ในเครื่องคุณต้องกังวลว่าจะ[Environment]::CurrentDirectory
ไม่เกี่ยวกับ$PWD
ไดเรกทอรีปัจจุบันของ PowerShell ด้วยเหตุผลหลายประการ PowerShell ไม่ได้ตั้งค่าไดเรกทอรีการทำงานปัจจุบันของกระบวนการเมื่อคุณตั้งค่าตำแหน่งหรือ Push-Location ดังนั้นคุณต้องแน่ใจว่าคุณทำเช่นนั้นหากคุณใช้แอปพลิเคชัน (หรือ cmdlets) ที่คาดว่าจะตั้งค่า
ในสคริปต์คุณสามารถทำสิ่งนี้:
$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
ไม่มีทางเลือกที่จะเข้าใจผิดได้สำหรับเรื่องนี้ พวกเราหลายคนใส่บรรทัดในฟังก์ชันพรอมต์ของเราเพื่อตั้งค่า [Environment] :: CurrentDirectory ... แต่นั่นไม่ได้ช่วยอะไรคุณเมื่อคุณเปลี่ยนตำแหน่งภายในสคริปต์
หมายเหตุสองประการเกี่ยวกับสาเหตุที่ทำไม PowerShell ถึงไม่ถูกตั้งค่าโดยอัตโนมัติ:
- PowerShell สามารถเป็นแบบมัลติเธรด คุณสามารถมีหลาย Runspaces (ดู RunspacePool และโมดูล PSThreadJob) ทำงานพร้อมกันภายในกระบวนการเดียว แต่ละพื้นที่
$PWD
ทำงานมีไดเรกทอรีการทำงานปัจจุบัน แต่มีเพียงกระบวนการเดียวและสภาพแวดล้อมเดียวเท่านั้น
- แม้ว่าคุณจะเป็นเธรดเดียว แต่
$PWD
ก็ไม่ได้เป็น CurrentDirectory ที่ถูกต้องตามกฎหมายเสมอไป (เช่นคุณอาจใส่ CD เข้าไปในผู้ให้บริการสตรีเช่น)
หากคุณต้องการใส่ลงในพรอมต์ของคุณ (ซึ่งจะทำงานใน runspace หลักเธรดเดียวเท่านั้น) คุณต้องใช้:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
ant
ด้วยพารามิเตอร์บางอย่าง ดังนั้นฉันต้องโทรant
จากโฟลเดอร์นั้นเพื่อให้แน่ใจว่าพบไฟล์การกำหนดค่าอย่างถูกต้อง เป็นการดีที่ฉันกำลังมองหาบางอย่างที่จะเปลี่ยนไดเรกทอรีการดำเนินการภายในสคริปต์นั้นชั่วคราว