আপনি যদি নেটিভ অ্যাপ্লিকেশনগুলিতে কল করছেন তবে আপনার [Environment]::CurrentDirectoryপাওয়ারশেলের $PWDবর্তমান ডিরেক্টরি সম্পর্কে নয় তা নিয়ে চিন্তা করা দরকার । বিভিন্ন কারণে, যখন আপনি সেট-লোকেশন বা পুশ-লোকেশন সেট করুন তখন পাওয়ারশেল প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরিটি সেট করে না, সুতরাং আপনি যদি অ্যাপ্লিকেশনগুলি (বা সেমিডলেট) চালিয়ে যাচ্ছেন এটি সেট হওয়ার প্রত্যাশা করে তবে আপনি এটি করছেন তা নিশ্চিত করা দরকার।
স্ক্রিপ্টে, আপনি এটি করতে পারেন:
$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
এর কোনও বুদ্ধিমান বিকল্প নেই। আমাদের মধ্যে অনেকে [পরিবেশ]] কারেন্টডাইরেক্টরি ... সেট করার জন্য আমাদের প্রম্পট ফাংশনে একটি লাইন রেখে দেয় তবে আপনি যখন কোনও স্ক্রিপ্টের মধ্যে অবস্থান পরিবর্তন করেন তখন তা আপনাকে সাহায্য করবে না ।
এটি পাওয়ারশেল দ্বারা স্বয়ংক্রিয়ভাবে সেট না হওয়ার কারণ সম্পর্কে দুটি নোট:
- পাওয়ারশেলটি বহু-থ্রেডযুক্ত হতে পারে। আপনার একাধিক রানস্পেস থাকতে পারে (রানস্পেসপুল এবং পিএসটিগ্র্যাডজব মডিউল দেখুন) একক প্রক্রিয়ার মধ্যে একসাথে চলছে। প্রতিটি রান স্পেসের নিজস্ব নিজস্ব
$PWDকার্যক্ষম ডিরেক্টরি রয়েছে তবে এখানে কেবল একটি প্রক্রিয়া এবং কেবল একটি পরিবেশ রয়েছে।
- এমনকি আপনি যখন একক থ্রেডেড হন,
$PWDসর্বদা আইনী কারেন্টডাইরেক্টরি হয় না (উদাহরণস্বরূপ আপনি রেজিস্ট্রি সরবরাহকারীতে সিডি করতে পারেন)।
আপনি যদি এটিকে আপনার প্রম্পটে রাখতে চান (যা কেবলমাত্র প্রধান রানস্পেসে চলবে, একক থ্রেডযুক্ত), আপনার প্রয়োজন:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
antকিছু পরামিতি সহ কল করে। সুতরাংantকনফিগারেশন ফাইলটি সঠিকভাবে খুঁজে পেয়েছে তা নিশ্চিত করার জন্য আমাকে সেই ফোল্ডারটি থেকে কল করতে হবে। আদর্শভাবে আমি সেই স্ক্রিপ্টের মধ্যে স্থানীয়ভাবে কার্যকরকরণ ডিরেক্টরিটি পরিবর্তন করার জন্য কিছু সন্ধান করছি।