কমান্ড লাইন আউটপুট দমন করুন


118

আমার কাছে এই জাতীয় ব্যাচের ফাইল রয়েছে:

প্রতিধ্বনিত

টাস্কিল / im "test.exe" </ f> নুল

বিরতি

যদি "test.exe" চলমান না থাকে তবে আমি এই বার্তাটি পাই:

ত্রুটি: প্রক্রিয়া "test.exe" পাওয়া যায় নি।

কেন আমি এইচআরএল থেকে আউটপুট পুনঃনির্দেশ করেছি, কেন এই ত্রুটি বার্তাটি প্রদর্শিত হবে?

আমি কীভাবে এই আউটপুটটি দমন করতে পারি?

উত্তর:


212

কারণ ত্রুটি বার্তাগুলি প্রায়শই যায় stderrনা stdout

অনুরোধটি এতে পরিবর্তন করুন:

taskkill /im "test.exe" /f >nul 2>&1

এবং সব ভাল হবে।

এটি কাজ করে কারণ stdoutফাইল বর্ণনাকারী 1, এবং stderrকনভেনশন অনুসারে ফাইল বিবরণী 2। (0 stdin, ঘটনাচক্রে।) 2>&11 এর নতুন মান থেকে অনুলিপি আউটপুট ফাইল বর্ণনাকারী 2, যা কেবল নাল ডিভাইসে পুনঃনির্দেশিত হয়েছিল।

এই সিনট্যাক্সটি অনেকগুলি ইউনিক্স শেল থেকে ধার করা হয়েছে (তবে শিথিল হওয়া উচিত) কারণ শেল সিনট্যাক্স এবং সিএমডি.এক্সইয়ের মধ্যে সূক্ষ্ম পার্থক্য রয়েছে।

আপডেট: আমি জানি যে ওপি NULআমি এখানে লিখছি সেই নামের "ফাইল" এর বিশেষ প্রকৃতিটি বোঝে , কিন্তু একজন মন্তব্যকারী তা করেনি এবং তাই আমাকে সেই দিকটি সম্পর্কে আরও কিছুটা বিশদভাবে আবিষ্কার করতে দিন।

এমএসডিএস-এর প্রথম দিকের প্রকাশের দিকে ফিরে কিছু নির্দিষ্ট ফাইলের নাম ফাইল সিস্টেম কার্নেল দ্বারা প্রম্পট করা হয়েছিল এবং ডিভাইসগুলির জন্য উল্লেখ করা হত। নামগুলো প্রাচীনতম তালিকা অন্তর্ভুক্ত NUL, PRN, CON, AUXএবং COM1মাধ্যমে COM4NULনাল ডিভাইস। এটি সর্বদা পড়া বা লেখার জন্য খোলা যেতে পারে, এতে যে কোনও পরিমাণ লেখা যেতে পারে এবং পড়া সর্বদা সফল হয় তবে কোনও ডেটা ফেরত দেয় না। অন্যান্যগুলির মধ্যে সমান্তরাল প্রিন্টার বন্দর, কনসোল এবং চারটি সিরিয়াল বন্দর অন্তর্ভুক্ত রয়েছে। এমএসডোস 5 হিসাবে, আরও বেশ কয়েকটি সংরক্ষিত নাম ছিল, তবে মূল কনভেনশনটি খুব ভাল প্রতিষ্ঠিত হয়েছিল।

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

উইন্ডোজ এনটি এবং সমস্ত সংস্করণ যা অনুসরণ করে (2 কে, এক্সপি, 7, এবং এখন 8) সমস্ত অনুসরণ করে কার্নেল কোড থেকে আরও বিস্তৃত এনটি নেমস্পেস এবং সাবধানে নির্মিত এবং উচ্চ-বহনযোগ্য ব্যবহারকারী স্পেস কোড ব্যবহার করে। এই নামের জায়গাতে, \Deviceফোল্ডারের মাধ্যমে ডিভাইস ড্রাইভাররা দৃশ্যমান । প্রয়োজনীয় পশ্চাদপদ সামঞ্জস্যতা সমর্থন করার জন্য \DosDevicesফোল্ডারটি ব্যবহার করে একটি বিশেষ পদ্ধতি রয়েছে যা কোনও ফাইল সিস্টেম ফোল্ডারে সংরক্ষিত ফাইলের নামের তালিকা কার্যকর করে। ব্যবহারকারীর কোডটি সাধারণ উইন 32 এপিআইয়ের নীচে একটি এপিআই স্তর ব্যবহার করে এই অভ্যন্তরীণ নাম স্থানটিকে ব্রাউজ করতে পারে; কার্নেল নেমস্পেসটি অন্বেষণ করার জন্য একটি ভাল সরঞ্জাম হ'ল মাইক্রোসফ্টের সিসি ইন্টার্নালালস গ্রুপের উইনওবিজে।

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


5
উত্তরের জন্য ধন্যবাদ এবং সর্বোপরি ব্যাখ্যাটির জন্য।
জোসেফস্টাইন্স

একটি সুপারিশ: taskkill /im "test.exe" /f >%temp%\nul 2>&1 & del %temp%\nul। এটি স্থানীয় ডিরেক্টরিতে একটি ফাঁকা নাল ফাইল আটকাতে বাধা দেবে
সামি বেঞ্চিরিফ

11
@ সামিবেঞ্চিরিফ, NULএকটি সংরক্ষিত ফাইলের নাম এবং NUL ডিভাইসে মানচিত্র। আপনি NULকোনও ডিরেক্টরিতে নাম দেওয়া একটি আসল ফাইল তৈরি করতে পারবেন না ।
RBerteig

7

পরিবর্তে এই স্ক্রিপ্টটি ব্যবহার করুন:

@taskkill/f /im test.exe >nul 2>&1
@pause

2>&1অংশটি আসলে কী করে তা হ'ল এটি stderrআউটপুটটিকে পুনর্নির্দেশ করে stdout। আমি নীচে এটি আরও ভাল ব্যাখ্যা করব:

@ টাস্কিল / এফ / আইএম পরীক্ষা.ইক্সে> নুল 2> ও 1

"Test.exe" টাস্কটি হত্যা করুন। পুনঃনির্দেশ stderrকরুন stdout। তারপরে, পুনর্নির্দেশ stdoutকরুন nul

@pause

Press any key to continue . . . কেউ চাপ না দেওয়া পর্যন্ত বিরতি বার্তাটি দেখান ।

দ্রষ্টব্য: @প্রতীকটি প্রতিটি কমান্ডের জন্য প্রম্পটটি লুকিয়ে রাখছে। আপনি এভাবে 8 টি বাইট সংরক্ষণ করতে পারবেন।

আপনার স্ক্রিপ্টটি কম সংস্করণ হতে পারে: চরিত্র কমান্ড দ্বিতীয় সময় পৃথক প্রথমবারের ফেরৎ জন্য ব্যবহার করা হয়, এবং। একটি অক্ষর একটি লাইন দুইবার প্রয়োজন হয় না। এই কোডটি আপনি 40 বাইট হিসাবে পোস্ট করেছেন তার পরেও মাত্র 40 বাইট! আমি আসলে 9 বাইট সংরক্ষণ করেছি একটি ক্লিনার কোডের জন্য উপরে দেখুন look
@taskkill/f /im test.exe >nul 2>&1&pause
&
@


হ্যাঁ আমি জানি পোস্টের অর্ধেকটি আসলে আপনার কোডটি কীভাবে সংক্ষিপ্ত করবেন।
ইকনস

3

mysqldump এর সাথে কাজ করে না: > nul 2> & 1
পরিবর্তে ব্যবহার করুন: 2> নুল
এটি স্ট্যাডার বার্তাটি দমন করে: "সতর্কতা: কমান্ড লাইন ইন্টারফেসে একটি পাসওয়ার্ড ব্যবহার করা নিরাপত্তাহীন হতে পারে"


0

পরিবর্তে আপনি এটি করতে পারেন:

tasklist | find /I "test.exe" > nul && taskkill /f /im test.exe > nul

তথ্যের প্রসঙ্গে ব্যাচ স্ক্রিপ্টগুলি থাকা সত্ত্বেও, আমি খুঁজে পেলাম যে পাওয়ারশেলের উপরের সিনট্যাক্সটি " আউট-ফাইল: ব্যর্থ হয়েছে : ফাইল স্ট্রিমকে এমন একটি ডিভাইস খোলার জন্য বলা হয়েছিল যা কোনও ফাইল ছিল না। 'com1:' বা 'lpt1: এর মতো ডিভাইসের সমর্থনের জন্য 'CreateFile কল, তারপর FileStream কনস্ট্রাকটর যে IntPtr হিসাবে একটি অপারেটিং সিস্টেম হ্যান্ডেল নিতে ব্যবহার করুন। "সমাধান প্রতিস্থাপন করতে হয় > nulসঙ্গে >$null
weir
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.