পাওয়ারশেল: শুধুমাত্র একটি কমান্ডের জন্য পরিবেশের পরিবর্তনশীল সেট করা


110

লিনাক্সে, আমি এটি করতে পারি:

$ FOO=BAR ./myscript

পরিবেশের ভেরিয়েবল এফও সেট হওয়ার সাথে সাথে "মাইক্রিপ্ট" কল করতে।

পাওয়ারশেলের ক্ষেত্রে কি একইরকম কিছু সম্ভব, যেমন প্রথমে ভেরিয়েবলটি সেট না করে, কমান্ডটি কল করে, এবং আবার ভেরিয়েবলটি পুনরায় সেট না করে?

আমার ব্যবহারের ক্ষেত্রে আরও পরিষ্কার হওয়ার জন্য - আমি এটি কোনও স্ক্রিপ্টের অংশ হিসাবে ব্যবহার করতে চাই না। বরং, আমার একটি তৃতীয় পক্ষের স্ক্রিপ্ট রয়েছে যার আচরণটি আমি পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে নিয়ন্ত্রণ করতে পারি, তবে এই ক্ষেত্রে কমান্ড লাইন আর্গুমেন্ট নয়। তাই টাইপিংয়ের মধ্যে বিকল্প করতে সক্ষম হওয়া

$ OPTION=1 ./myscript

এবং

$ ./myscript

খুব সহজ হবে।


আমার ধারণা আমার প্রশ্নটি হ'ল কেন আপনার এটি করা দরকার? আমি ভাবব যে এর থেকে আরও ভাল সমাধান আছে।
EBGreen

24
এটি সাধারণত সহায়ক প্রশ্ন নয়, @ ইবিগ্রিন। ইউনিক্স শেলগুলিতে সামর্থ্য রয়েছে এমন বিষয়টি থেকেই বোঝা যায় যে এর ব্যবহার রয়েছে is আমার মাথার শীর্ষটি বন্ধ: কমিটের জন্য ব্যবহারকারীর নাম এবং ইমেল ঠিকানা গিট ব্যবহার নিয়ন্ত্রণ করে। এগুলির জন্য কোনও কমান্ড-লাইন বিকল্প নেই - আপনার সেগুলি প্রতিটি os / .gitconfig, .git / কনফিগার করে প্রতিটি সংগ্রহস্থল অথবা এনভায়ারে সেট করতে হবে। এই বিকল্পগুলির মধ্যে, এনভায়াররা ফ্লাই অন (ফ্লাইতে মানগুলি সুবিধামত ওভাররাইড করা) পরিষ্কার করা সহজ। সুতরাং আমি যদি পাওয়ারশেলের একটি "গিট কমিট" এর জন্য আমার লেখকের নাম পরিবর্তন করতে চাই তবে কীভাবে এটি করা যায়?
মার্ক রিড

4
সম্পূর্ণরূপে একমত যে এটি কেন প্রয়োজন তা জিজ্ঞাসা করা অর্থহীন। এটি লিনাক্সের কমান্ড লাইনে নির্বাহের সময় যেমন বোর্স্টের মতো সাধারণ এবং আমাদের মধ্যে যারা এখন পাওয়ারশেলের (যে কোনও সিন্ট্যাকটিক দুঃস্বপ্নের মুখোমুখি হয়) তাদেরকে ক্রমাগত সুস্পষ্ট কৌশলগুলির উত্তর অনুসন্ধান করতে হয় with বেশিরভাগ সময়, এগুলি ক্ষমতার বাইরেও উপস্থিত থাকে না যতক্ষণ না আপনি তুচ্ছ কাজগুলি করার জন্য দীর্ঘ স্ক্রিপ্টগুলি লেখার জন্য গণনা করেন। আমাকে সেই শেলটি দিয়ে গভীরভাবে হতাশ হয়ে উঠুন ...
কিম


4
লিঙ্কটির জন্য ধন্যবাদ, @ ফ্র্যাঙ্কলিনইউ, তবে এই মুহুর্তে এটি v7.0 এর পরে খুব বেশি দূরবর্তী ভবিষ্যতের সংস্করণে আশাবাদী হবে
mklement0

উত্তর:


56

সাধারণত, স্ক্রিপ্টের কাছে কোনও বৈশ্বিক (পরিবেশ) পরিবর্তনশীলের পরিবর্তে প্যারামিটারের মাধ্যমে তথ্য পাঠানো ভাল। তবে যদি এটি করার দরকার হয় তবে আপনি এটি এইভাবে করতে পারেন:

$env:FOO = 'BAR'; ./myscript

পরিবেশের পরিবর্তনশীল v env: এফইও পরে মুছে ফেলা যেতে পারে:

Remove-Item Env:\FOO

4
কেবলমাত্র একটি চিন্তা: আপনি কী কোনও নতুন পাওয়ারশেল প্রক্রিয়া চালাবেন না, স্ক্রিপ্টব্লকটিকে -কমন্ড প্যারামিটারের মাধ্যমে হস্তান্তর করে? এইভাবে আপনার পরে পরিবেশ পরিষ্কার করতে হবে না, যেহেতু এটি শিশু প্রক্রিয়াতে অন্তর্ভুক্ত থাকবে। যদিও আমি একটি পাওয়ারশেল এমভিপির সাথে কথা বলছি তাই এটি সম্ভবত কার্যকর হয় না :-)
জো

4
কিথ, ঠিক আমাদের এই দৃশ্যের জন্য পিএসসিএক্সে একটি পুশ-এনভায়রনব্লক এবং পপ-এনভায়রনমেন্ট ব্লক রয়েছে ;-)
x0n

4
জোহানেস, এটি পাশাপাশি কাজ করবে তবে কোনওরকম প্রতারণার মতো বলে মনে হচ্ছে। :-) পিএসসিএক্স পুশ / পপ-এনভায়রনব্লক ( আমি যেভাবে এইভাবে কাজটি করার জন্য পরিবর্তন করেছি ) কাজ করবে তবে এতে কোনও স্ক্রিপ্টব্লকের স্বয়ংক্রিয় ক্লিনআপ সমর্থন নেই।
কিথ হিল

4
আপনার env:fooএটি অপসারণের পরিবর্তে এটির পুরানো মানটিতে (সম্ভবত আনসেট) সেট করার দরকার নেই?
chwarr

4
যেমন @Joey উল্লেখ করা হয়েছে, যদি তোমরা env পরিচ্ছন্নভাবে Vars কাজ করতে চান, আপনি পারে: & {$pre = $env:foo; $env:foo = 'bar'; ./myscript; if ($pre) {$env:foo = $pre} else {Remove-Item env:\foo}... কিছু বলতে পারে জবরজং কিন্তু পার্শ্বপ্রতিক্রিয়া এড়ানো হবে ...
লুকাস

14

আমি এই সমস্যাটি সম্পর্কে যথেষ্ট অনুপ্রাণিত হয়েছি যে আমি এগিয়ে গিয়েছিলাম এবং এর জন্য একটি স্ক্রিপ্ট লিখেছিলাম: উইন্ড-এনভি.পিএস 1 দিয়ে

ব্যবহার:

with-env.ps1 FOO=foo BAR=bar your command here

# Supports dot-env files as well
with-env.ps1 .\.env OTHER_ENV=env command here

অন্যদিকে, আপনি গা ইনস্টল করলে আপনি ব্যবহার করতে পারেন env.exeযা আমি উপরে উল্লিখিত দ্রুত স্ক্রিপ্টের চেয়ে কিছুটা শক্তিশালী হতে পারে।

ব্যবহার:

env.exe FOO=foo BAR=bar your command here

# To use it with dot-env files
env.exe $(cat .env | grep.exe -v '^#') SOME_OTHER_ENV=val your command

6

একক লাইনে এটি করার 2 সহজ উপায়:

$env:FOO='BAR'; .\myscript; $env:FOO=''
$env:FOO='BAR'; .\myscript; Remove-Item Env:\FOO

অন্যান্য উত্তরগুলির (কেবলমাত্র আপনাকে ধন্যবাদ) থেকে সংক্ষিপ্ত বিবরণ দেওয়া হয়েছে যা কোনও কারণে খাঁটি ওয়ান-লাইনার ধারণ করে না।


4

ইউনিক্স সিনট্যাক্সের সমতুল্য কাজটি সম্পাদন করতে আপনাকে কেবল পরিবেশের পরিবর্তনশীল সেট করতে হবে না, আপনি কমান্ডটি কার্যকর করার পরে এটি পূর্বের মানটিতে পুনরায় সেট করতে হবে। আমার পাওয়ারশেল প্রোফাইলে নিম্নলিখিতগুলির অনুরূপ ফাংশন যুক্ত করে আমি ব্যবহৃত সাধারণ কমান্ডগুলির জন্য এটি সম্পন্ন করেছি।

function cmd_special()
{
  $orig_master = $env:app_master
  $env:app_master = 'http://host.example.com'
  mycmd $args
  $env:app_master = $orig_master
}

তাই mycmdকিছু এক্সিকিউটেবল পরিবেশ ভেরিয়েবলের মান উপর নির্ভর করে ভিন্নভাবে পরিচালিত হয় app_master। সংজ্ঞায়িত করে cmd_special, আমি এখন cmd_specialকমান্ড লাইন থেকে (অন্যান্য পরামিতি সহ) app_masterএনভায়রনমেন্ট ভেরিয়েবল সেট দিয়ে এক্সিকিউট করতে পারি ... এবং কমান্ড কার্যকর হওয়ার পরে এটি পুনরায় সেট (বা এমনকি আনসেট) হয়।

সম্ভবত, আপনি একটি একক অনুরোধের জন্য এই অ্যাড-হকও করতে পারেন।

& { $orig_master = $env:appmaster; $env:app_master = 'http://host.example.com'; mycmd $args; $env:app_master = $orig_master }

এটি এর চেয়ে সত্যই সহজ হওয়া উচিত, তবে স্পষ্টতই এটি এমন কোনও ব্যবহারের ক্ষেত্রে নয় যা পাওয়ারশেলের দ্বারা সহজেই সমর্থিত। সম্ভবত ভবিষ্যতের সংস্করণ (বা তৃতীয় পক্ষের ক্রিয়াকলাপ) এই ব্যবহারের ক্ষেত্রে সহজতর করবে। পাওয়ারশেলের যদি একটি সেমিডলেট থাকে যা এটি করতে পারে তবে এটি দুর্দান্ত হবে, যেমন:

with-env app_master='http://host.example.com' mycmd

সম্ভবত কোনও পাওয়ারশেল গুরু পরামর্শ দিতে পারে যে কীভাবে এই জাতীয় সেন্টিমিটার লিখতে পারে।


0

সিএমডি হ'ল উইন্ডোজ কার্নেলের নেটিভ সিএলআই (এবং এখনও প্রচুর সরঞ্জামের জন্য অটোমেশন ইন্টারফেস) বিবেচনা করে আপনি powershell.exeসিএমডি প্রম্পট বা সিএমডি কনসোলের বিবৃতি গ্রহণ করে এমন একটি ইন্টারফেস দিয়ে আপনার পাওয়ারশেল স্ক্রিপ্টটি সম্পাদন করতে পারেন ।

আপনি যদি -Fileআপনার স্ক্রিপ্টটি এখানে powershell.exeপ্রবেশের জন্য প্যারামিটারটি ব্যবহার করছেন, স্ক্রিপ্টটি অ্যাক্সেস করার জন্য কোনও পরিবেশ পাওয়ার ভেরিয়েবল সেট করতে অন্য কোনও পাওয়ারশেল কোড ব্যবহার করা যাবে না, তার পরিবর্তে আপনি সিএমডি পরিবেশে আপনার পরিবেশের ভেরিয়েবলগুলি কল করার আগে সেট করতে পারেন powershell.exe:

> set foo=bar && powershell.exe -File .\script.ps1

একটি সিঙ্গলও &কাজ করবে, তবে setকোনও কারণে ব্যর্থ হলে কমান্ডটি চালিয়ে যেতে দেবে । (এটা কি সম্ভব? আমার কোনও ধারণা নেই।)

এছাড়াও, "foo=bar"উদ্ধৃতিগুলিতে মোড়ানো আরও নিরাপদ হতে পারে যাতে setভেরিয়েবলের বিষয়বস্তু হিসাবে নিম্নলিখিত কোনও কিছুই পাস না হয়।


-5

আপনি ফাংশন এবং স্ক্রিপ্টে স্কোপ ভেরিয়েবল করতে পারেন।

$script:foo = "foo"
$foo
$function:functionVariable = "v"
$functionVariable

আপনি যদি আনুষ্ঠানিক হতে চান এবং নতুন ভেরিয়েবলটি ব্যবহার করে আপনার ভেরিয়েবলটি ঘোষণা করতে চান তবে নিউ-ভেরিয়েবলের একটি -স্কোপ প্যারামিটারও রয়েছে।


4
হুম ... ভাববেন না যে এই উত্তরটি এখানে প্রযোজ্য। পাওয়ারশেল ভেরিয়েবলগুলি পরিবেশের ভেরিয়েবল নয়। প্রশ্নের ভিত্তিতে, প্রশ্নকর্তা পরিবেশের পরিবর্তনশীলগুলি স্ক্র্যাচ স্পেস হিসাবে ব্যবহার করছেন না (যেমন সিএমডি-তে থাকত [যদি সে ক্ষেত্রে এই উত্তরটি প্রযোজ্য হবে)) তবে কোনও বাহ্যিক কমান্ড চাওয়ার আগে পরিবেশকে হেরফের করতে হবে এবং তারপরে পুনরুদ্ধার করা দরকার পরবর্তী পরিবেশ (বা সেই প্রভাবের কিছু)।
chwarr

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.