উইন্ডোজ ব্যাচ: ফর লুপে একাধিক কমান্ড কল করবেন?


124

উইন্ডোজ ব্যাচ ফাইলে কি একক FOR লুপে একাধিক কমান্ড কল করা সম্ভব ? উদাহরণস্বরূপ বলা যাক আমি ফাইলের নাম মুদ্রণ করতে চাই এবং এটি মুছার পরে:

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

আমি জানি আমি এক্ষেত্রে দুটি লুপের জন্য আলাদা আলাদা করে এটি সমাধান করতে পারলাম: একটি নামটি দেখানোর জন্য এবং একটি ফাইল মুছে ফেলার জন্য, তবে এটি কেবল একটি লুপে করা সম্ভব?

উত্তর:


117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

2
আসলে, আমি মনে করি বন্ধনীগুলি অপ্রয়োজনীয়। for %i in (1 2 3) do echo %i & echo fooআমি যা প্রত্যাশা করব তা মুদ্রণ করে: "1", "ফু", "2", "ফু", "3", "ফু" (পৃথক লাইনে)।
বিকে 1 ই

&&তার চেয়ে বেশি হওয়া উচিত নয় &?
jww

9
@jww &&ব্যর্থ হবে যদি প্রথম কমান্ড ব্যর্থ হয়, &নির্বিশেষে দ্বিতীয় কমান্ড কার্যকর করবে।
yyny

যদি এই সমাধানটি আপনার জন্য একটি সিনট্যাক্স ত্রুটি করে, আপনি যদি- DOপ্যারেনগুলির মধ্যে একটি অবিরত পেরেন পেয়েছেন কিনা তা দেখুন। আপনি এগুলিকে সংযুক্ত করে এগুলি থেকে বাঁচতে পারেন ^
26 Ван

199

&সংক্ষিপ্ত কমান্ডগুলির জন্য ব্যবহার করা ভাল, তবে সেই একক লাইন খুব দীর্ঘ খুব দ্রুত পেতে পারে। যখন এটি হয়, মাল্টি-লাইন সিনট্যাক্সে স্যুইচ করুন।

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

এর প্লেসমেন্ট (এবং )গুরুত্বপূর্ণ। এর পরে গোলাকার বন্ধনীগুলি DOএকই লাইনে রাখতে হবে, অন্যথায় ব্যাচের ফাইলটি ভুল হবে।

দেখুন if /?|find /V ""বিস্তারিত জানার জন্য।


12
এই সমাধানটি পরিষ্কার এবং পঠনযোগ্য বলে মনে হচ্ছে। আমি যে কোনও প্রোগ্রামারকে এই সমাধানটি ব্যবহার করে তাকে সতর্ক করে বলব যে গোলাকার বন্ধনীটি DOপরবর্তী লাইনে স্থাপন করা উচিত নয় অন্যথায় এটি ব্যাচের ফাইলটিকে ব্রেক করে। কোডে যখন আমি লুপের জন্য লিখি তখন আমি সাধারণত কোঁকড়া বন্ধনী {পরবর্তী লাইনে রাখি ।
মার্কো ডেমাইও

2
এছাড়াও - সতর্ক থাকুন যদি আপনার কোনও নেস্টেড কমান্ডের ব্র্যাকেট থাকে (উদাহরণস্বরূপ, "প্রতিধ্বনি কিছু কিছু (অন্য কিছু)" এর মতো সম্পাদনা: আহ, বিকে 1 এর উত্তর দেখুন :)
টিম

31

সিলভারস্কিন এবং অ্যান্ডারস উভয়ই সঠিক। একাধিক কমান্ড কার্যকর করতে আপনি প্রথম বন্ধনী ব্যবহার করতে পারেন। তবে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে কমান্ডগুলি তাদের (এবং তাদের পরামিতিগুলি) মধ্যে প্রথম বন্ধনী নেই। cmdলোভজনকভাবে প্রথম বন্ধনীর প্রথম বন্ধনীর সন্ধান করুন, পরিবর্তে নেত্রিত সেটগুলি বন্ধুত্বপূর্ণভাবে পরিচালনা করার পরিবর্তে। এটি বাকী কমান্ড লাইনকে বিশ্লেষণে ব্যর্থ হতে পারে বা এর ফলে কিছু বন্ধনী কমান্ডগুলিতে পাস হতে পারে (যেমন DEL myfile.txt))।

এর জন্য একটি কার্যপ্রণালী হ'ল লুপটির শরীরে আলাদা ফাংশনে বিভক্ত করা। নোট করুন যে এটিতে "পড়তে" এড়াতে আপনাকে সম্ভবত ফাংশন বডির চারপাশে ঝাঁপিয়ে পড়তে হবে।

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF

:loopbody
ECHO %1
DEL %1
GOTO :EOF

3
আমরা যখন বিষয়টিতে থাকি তখন ফাইল নামগুলির সাথে লেনদেন করার সময়% এক্স কখনই সঠিক হয় না, সর্বদা "% ~ এক্স" ব্যবহার করুন (আপনার উদাহরণে এখানে, আপনি সম্ভবত সাবফিউশনে% * ব্যবহার করে পালিয়ে যেতে পারেন)
অ্যান্ডার্স

1
এটা সত্যিই ভাল পয়েন্ট। উভয় সমস্যা প্রদর্শন করে এমন একটি পথের একটি ভাল উদাহরণ C:\Program Files (x86)
বি কে 1 ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.