একক ব্যাচ-ফাইল কমান্ডের জন্য অস্থায়ীভাবে ডিরেক্টরি পরিবর্তন করুন


19

শেল-স্ক্রিপ্টিংয়ে যদি আমাকে কোনও ডিরেক্টরি থেকে একটি কমান্ড চালাতে হয় তবে আমি আসল প্রসঙ্গে ফিরে আসার বিষয়টি নিশ্চিত করতে একটি সাব-শেল করতে পারি:

(cd temporary/new/directory ; command)
# now I am still in original directory

এটি কি উইন্ডোজ ব্যাচ-ফাইলগুলিতে করা যেতে পারে (বা সেমিডি-ফাইলগুলি)

ব্যাচ-ফাইলগুলিতে একই কাজটি আমাকে নতুন ডিরেক্টরিতে ফেলে।

আমি করতে পারি:

pushd temporary\new\directory && command && popd

তবে পপড সাফল্যের উপর নির্ভরশীল command

কোন ধারনা?


আপনি কীভাবে আপনার "ব্যাচ-ফাইল" বা "সেমিডি-ফাইল" চালু করছেন? আপনি যদি একটি শেল স্ক্রিপ্টে সিডি কমান্ড রেখে সেই স্ক্রিপ্টটি চালিত করেন (এটি উত্স নয়), কলিং শেলের বর্তমান কার্যকারী ডিরেক্টরিটি পরিবর্তন হবে না।
গ্যারিজন জন

পরিষ্কার করার জন্য এটি উইন্ডোজ ব্যাচ-ফাইলগুলি উল্লেখ করছে।
গ্রেগ

এটি একটি স্ক্রিপ্ট যা ডিরেক্টরি গাছের বিভিন্ন অংশে একগুচ্ছ কমান্ড চালায়। কিছু কমান্ড কেবলমাত্র বর্তমান ডিরেক্টরিতে কাজ করে। মূল ডিরেক্টরিতে ফিরে যাওয়া স্ক্রিপ্টটি চালিত ডেটা সহজতর করতে সহায়তা করে। আপনি কি প্রতিটি ডিরেক্টরিতে কল করতে হবে তার জন্য আলাদা ব্যাচ-ফাইল করার পরামর্শ দিচ্ছেন?
গ্রেগ

আমার মনে আছে, আপনি শেল স্ক্রিপ্টগুলি উল্লেখ করেছেন এবং আপনার মূল প্রশ্নে উইন্ডোজটির উল্লেখ করেননি, তাই আমি ভুলভাবে ধরে নিয়েছি যে আপনি ইউনিক্সের মতো সিস্টেমটি ব্যবহার করছেন। এখন বুঝতে পারছি।
গ্যারিজন জন

হ্যাঁ, দুঃখিত, আমি বুঝতে পারি যে আমি পরিষ্কার ছিলাম না (যদিও আমি মনে করি 'ব্যাচ-ফাইল' একটি ইঙ্গিত ছিল :-p)
গ্রেগ

উত্তর:


21

যদি তুমি করো:

pushd \windows && foobar && popd

আপনি উইন্ডোজ ফোল্ডারে রেখে যাবেন (যেমন আপনি বলেছেন)। চেষ্টা করুন:

pushd \windows & foobar & popd

এবং আপনি যেখানে শুরু করেছিলেন সেখানে ফিরে নিজেকে খুঁজে পাওয়া উচিত।


1
আহ, সুতরাং একক অ্যাম্পারস্যান্ড হ'ল sh এ আধা-কোলনের সমতুল্য। ঐটা নির্ভুল. (এবং একটি রেফারেন্স: ss64.com/nt/syntax-conditional.html )
গ্রেগ

6
এটি মনে রাখা ভাল cd/ pushdকখনও কখনও ব্যর্থ হয় (উদাহরণস্বরূপ ডিরেক্টরি উপস্থিত না থাকলে)। pushd \windows && (foobar & popd)আরও নির্ভরযোগ্য হতে পারে
user1686

16

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

setlocalএটির নিজের প্রসঙ্গে চালানোর জন্য আপনার স্ক্রিপ্টের শীর্ষে রাখুন - আপনি cdতখন স্ক্রিপ্টের ভিতরে নিরাপদে ব্যবহার করতে পারেন ।


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

1
@ গ্রেগ: দেখে মনে হচ্ছে যে ( )কেবল গোষ্ঠীই একসাথে কমান্ড করেছে তবে তবুও এগুলি প্যারেন্ট প্রসঙ্গে চালাবে। (setlocal & cd foo & bar)কাজ করবে না; পরিবর্তে pushd foo && (bar & popd)প্রয়োজন হবে।
ব্যবহারকারীর 6868

4

গ্রাভিটি পূর্বে উল্লিখিত হিসাবে, pushd \windows && (foobar & popd)আরও ভাল কাজ করবে pushd \windows & foobar & popdকারণ এই জাতীয় ডিরেক্টরি না থাকলে পরেরটি ব্যর্থ হতে পারে।

এছাড়াও, ব্যবহার setlocalএবং endlocalআপনাকে একাধিক স্থানীয় পরিবেশ থাকতে দেয়, উদাহরণস্বরূপ আপনার থাকতে পারে:

setlocal

cd dir

command

endlocal

এখন আপনি আপনার মূল ডিরেক্টরিতে ফিরে আসবেন।


3

আপনি cd -পূর্ববর্তী ওয়ার্কিং ডিরেক্টরিতে ফিরে যেতে ব্যবহার করতে পারেন। এবং এর ;পরিবর্তে ব্যবহার করুন &&, তারপরে পরবর্তী কমান্ডগুলি পূর্ববর্তী কমান্ডগুলির সাফল্যের উপর নির্ভর করবে না।

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

আমি উইন্ডোজ ব্যাচ / শেল স্ক্রিপ্টিং সম্পর্কে জিজ্ঞাসা করতে স্পষ্ট করতে প্রশ্ন আপডেট করেছি। আমি জানি কীভাবে এটি কোনও শ-শেলের নীচে করতে হবে :)
গ্রেগ

যেমন বিলপি 3 তম ';' এর সমতুল্য নির্দেশ করেছে ব্যাচ-ফাইলগুলিতে 'এবং' থাকে।
গ্রেগ

ওহ দুঃখিত. আপনার ফরোয়ার্ড স্ল্যাশ ব্যবহার আমাকে ভাবতে বাধ্য করেছিল যে এটি ইউনিক্স।
বাহামাত

1

আমি setlocalআপনার ব্যাচের স্ক্রিপ্টের শুরুতে রেখে দেওয়ার জন্য গুরুতর পরামর্শের প্রশংসা করি , তবে আমি এই সত্যটি যুক্ত করব যে আপনার একাধিক, নেস্টেড setlocal/ endlocalব্লক থাকতে পারে, তাই প্রশ্নের আরও প্রাসঙ্গিক উত্তর হতে পারে

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

এবং, অবশ্যই, যদি তুমি চাও কমান্ড শুধুমাত্র যদি নিষ্পন্ন করা হবে cdথেকে dir2সফল হয়, বলতে ।cddir2&&command

মনে রাখবেন যে setlocal/ endlocalব্লক একটি স্থানীয় পরিবেশ তৈরি করে, সুতরাং আপনি যে কোনও ভেরিয়েবলগুলি সেট করেছেন বা এই জাতীয় ব্লক পরিবর্তন করেছেন তা তার আগের মানটিতে ফিরে আসবে endlocal


0

আপনি চলমান ডিরেক্টরিটি একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন। কমান্ডের ফেরতের মানের উপর নির্ভর করে পরিবর্তন এবং পরিবর্তন করুন change বিটিডাব্লু,% সিডি% আপনার বর্তমান ডিআইআর প্রদান করে।

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