উইন্ডোজ সেন্টিমিডিতে একটি ফাইলের সাথে কমান্ড আউটপুট রচনা করা (একটি মোড় দিয়ে)


9

সুতরাং আমি চালানোর চেষ্টা করছি foo.exe, তবে আমি টার্মিনালে আউটপুট চাই না তবে একটি ফাইল চাই। দৌড়ানো foo.exe > foo.txtআমার পক্ষে এটি সম্পাদন করা উচিত, তবে তা হয় না। আমি যখন এক্সি-ফাইল চালাচ্ছি তখন আমি আউটপুট পাব। এক্সি অন্য কথায় ভাল কাজ করছে। যাইহোক, আমি যখন কোনও ফাইলে আউটপুট প্রেরণের চেষ্টা করি তখন কেবলমাত্র আমি পাই তা হ'ল:

'c:/Program' is not recognized as an internal or external command,
operable program or batch file.

এই শুধুমাত্র আপ যখন আমি একটি ফাইল পাঠাতে চেষ্টা শো। এটি যে পথটি হতে পারে (যা এমন c:\Program Files (x86)\এবং তাই) যা ভুল ব্যাখ্যা করা যায় তা ভেবে, আমি এইভাবে আউটপুট ফাইলটি উল্লেখ করার চেষ্টা করেছি: foo.exe > c:\test.txtতবে এখনও আনন্দ নেই still

সুতরাং, আমি যে বাইনারিটি চালানোর চেষ্টা করছি সেগুলি খুব খারাপভাবে লেখা হয়েছে তা বাদ দিয়ে, এর প্রতিকারের জন্য আমি কি কিছু করতে পারি? মনে রাখবেন যে সহজভাবে এক্সপি চালানোর সময় আমি বৈধ আউটপুট পাব, এটি কোনও ফাইলে খুব ভাল প্রিন্ট করবে না। স্পষ্টতই আউটপুট আছে, এটি ধরার কোনও উপায় থাকলে প্রশ্ন is


আপনি যদি প্রোগ্রামটিকে একটি সাধারণ ডিরেক্টরিতে নিয়ে যান (সি: \ সরল বা এমনকি সি: \) এবং সেখান থেকে এই জিনিসগুলি চেষ্টা করে দেখুন?
জান ডোগজেন

উত্তর:


22

আপনি যে কমান্ডটি ব্যবহার করছেন সেটি ব্যর্থ হচ্ছে তা আপনি প্রদর্শন করেন নি। আপনি যদি এটি আপনার প্রশ্নে দেখান তবে আপনার পক্ষে সমাধান খুঁজে পাওয়া আরও সহজ।

আমি আশা করি আপনার আদেশটি এরকম কিছু:

C:\>foo.exe|c:\Program Files (x86)\something\test.txt

আপনি যে ত্রুটিটি পেয়ে যাচ্ছেন তা হ'ল কিছু চিহ্নের মধ্যে রয়েছে:

'c:/Program' is not recognized as an internal or external command, operable program or batch file.

প্রথম:
... is not recognized as an internal or external command, operable program or batch file.

এটি সাধারণত ঘটে যখন আপনি একটি এর |পরিবর্তে কোনও ফাইলকে পুনর্নির্দেশের চেষ্টা করেন >

দ্বিতীয়ত:
'c:/Program' ...

শূন্যস্থান সম্বলিত কোনও ফাইলের নাম (বা পথ) নির্দিষ্ট করার সময়, আপনাকে অবশ্যই এটি দ্বিগুণ-উদ্ধৃতি চিহ্ন ( "...") দিয়ে ঘিরে রাখতে হবে । এর কারণ যখন অপারেটিং সিস্টেম ফাইল নির্ণয় করা হয়, এটা ফাইলের নাম খুঁজছেন যখন এটি একটি unquoted স্থান encounters বন্ধ হবে পুনর্নির্দেশ করতে: "c:/Program"

এটা চেষ্টা কর:

foo.exe>"c:\Program Files (x86)\something\test.txt"



উপরেরটি যদি foo.exeটেক্সট ফাইল থেকে আউটপুট ক্যাপচারে কাজ না করে , তবে আর একটি সম্ভাবনা রয়েছে ...

যদি প্রোগ্রামটি foo.exeতার আউটপুট STDERRপরিবর্তে লিখতে থাকে তবে একটি একক দিয়ে সাধারণ পুনর্নির্দেশ ব্যবহার STDOUTকরে আউটপুট foo.exeআটকানো হবে না >। আপনার এটি এটি করতে হবে:

foo.exe>"c:\Program Files (x86)\something\test.txt" 2>&1



সম্পাদনা:

ফাইল পুনর্নির্দেশকরণ এবং 2>&1স্বরলিপি সম্পর্কে এখানে একটি ব্যাখ্যা ।

কোনও প্রোগ্রাম টার্মিনালে লিখলে এটি দুটির মধ্যে একটিতে লিখতে পারে Streams

  1. স্ট্রিম 1 হিসাবে উল্লেখ করা হয় STDOUTবা মান- আউটপুট । সাধারণত, প্রোগ্রামগুলি স্ট্রিম 1 এ তাদের "স্বাভাবিক" আউটপুট লেখেন ।

  2. স্ট্রিম 2 হিসাবে উল্লেখ করা হয় STDERRবা মান- ত্রুটি । সাধারণত, প্রোগ্রামগুলি স্ট্রিম 2 এ তাদের "ত্রুটি" আউটপুট (ত্রুটি এবং সতর্কতা বার্তা) লিখে ।

কোনও প্রোগ্রাম কোনও নির্দিষ্ট আউটপুট লেখেন STDOUTবা STDERRনা প্রোগ্রামার দ্বারা নির্ধারিত হয় এবং কীভাবে তারা প্রোগ্রামটি লিখেছিল। কিছু প্রোগ্রাম সমস্ত আউটপুট (সাধারণ আউটপুট এবং ত্রুটি) প্রেরণে লিখিত হয় STDOUT

যখন কোনও প্রোগ্রাম কোনও আউটপুট পুনঃনির্দেশ ছাড়াই চালিত হয়, সমস্ত স্বাভাবিক এবং ত্রুটি আউটপুট STDOUTআউটপুট বা STDERRআউটপুট কি তার মধ্যে কোনও পার্থক্য ছাড়াই টার্মিনাল স্ক্রিনে প্রেরণ করা হয় ।

আপনি যখন >এই জাতীয় একটির সাথে "সাধারণ" পুনঃনির্দেশটি করেন :

foo.exe > "c:\Program Files (x86)\something\test.txt"

আপনি কোন স্ট্রিমটি ফাইলটিতে পুনঃনির্দেশিত হচ্ছে তা উল্লেখ করছেন না , সুতরাং স্ট্রিম 1 ধরে নেওয়া হয়েছে।

এটি যেমন আপনি এটি টাইপ করেছেন তেমন:

foo.exe 1> "c:\Program Files (x86)\something\test.txt"

এটি কমান্ড ইন্টারপ্রেটারকে ( cmd.exe) কে STDOUTনির্দিষ্ট ফাইলনামে (স্ট্রিম 1) এর জন্য প্রোগ্রাম আউটপুট ক্যাপচার করতে বলে । 1মধ্যে 1>স্ট্রিম 1 বোঝায়।

এক্ষেত্রে সমস্ত সাধারণ প্রোগ্রাম ফাইলটিতে ধারণ করা হয়, তবে প্রোগ্রামটি যদি STDERR(স্ট্রিম 2) লিখিত হয়, তবে আউটপুট ক্যাপচার হবে না এবং স্ক্রিনে প্রদর্শিত হবে। এটি এটি করার জন্য সাধারণত "কাঙ্ক্ষিত" উপায় এটি যাতে আপনি সাধারণ প্রোগ্রাম আউটপুট ক্যাপচার করার সময়, কোনও ত্রুটি দেখা দিলে আপনি পর্দায় দেখতে পারেন।

আপনি যদি কোনও ফাইলে "সাধারণ" আউটপুট এবং অন্য কোনও ফাইলে "ত্রুটি" আউটপুট ক্যাপচার করতে চান তবে আপনি এটি এইভাবে করতে পারেন:

    foo.exe > "c:\output.txt" 2> "C:\error.txt"
or
    foo.exe 1> "c:\output.txt" 2> "C:\error.txt"

আপনি যদি "নরমাল" আউটপুট এবং "ত্রুটি" আউটপুট একই ফাইলটিতে ধারণ করতে চান তবে আপনি এটিকে এটি নির্দিষ্ট করতে পারেন:

foo.exe > "c:\output.txt" 2>&1

এটি মূলত এটি নির্দিষ্ট করার একটি "শর্টহ্যান্ড" উপায় এবং এর অর্থ স্ট্রিম 1টিকে নির্দিষ্ট ফাইলে পুনর্নির্দেশ করা এবং স্ট্রিম 2 কে একই "স্থান" (ফাইল) এ স্ট্রিম 1 হিসাবে পুনঃনির্দেশ করা ।


সম্পাদনা:

পেসারিয়ার জিজ্ঞাসা:

Foo.exe> ​​"সি: \ আউটপুট.txt" 2> & 1 এবং foo.exe> ​​"সি: \ আউটপুট.txt" 2> "সি: \ আউটপুট.টেক্সট" এর মধ্যে কি কোনও পার্থক্য রয়েছে? তারা কি অভিন্ন?

সংক্ষিপ্ত উত্তর: আপনি ভাবেন যে এগুলি অভিন্ন, তবে তা নয়। তারা ভিন্ন ধরনের.

পুনর্নির্দেশের সাহায্যে >"filename.ext", 1>"filename.ext"বা 2>"filename.ext", "আউটপুট.ইেক্সট" নামে >একটি নতুন ফাইলে আউটপুট লেখার কারণ হয় । "Filename.ext" ফাইলটি ইতিমধ্যে উপস্থিত থাকলে, এটি প্রথমে মুছে ফেলা হবে।

সুতরাং, ব্যবহার করে:

foo.exe> ​​"c: \ output.txt" 2> "সি: \ আউটপুট.txt"

উভয় পুনর্নির্দেশগুলি একই ফাইলটিতে লেখার চেষ্টা করছে এবং উভয়ই যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে তবে মুছতে চেষ্টা করছে এমন একটি "দ্বন্দ্ব" সৃষ্টি করে। এটি সম্ভবত অনাকাঙ্ক্ষিত আচরণের কারণ হবে। সাধারণত, আউটপুটগুলির মধ্যে একটি বা অন্য, বা উভয়ই পুরোপুরি ধরা যায় না বা অনুমানযোগ্য ict

আসল ফলাফল অপারেটিং সিস্টেম এবং সংস্করণ উপর নির্ভর করবে, এবং কার্যকর করা কমান্ড উপর নির্ভর করে। সম্ভবত কি ঘটবে তা হ'ল:

1 পুনর্নির্দেশগুলির একটিতে প্রেরিত আউটপুট ক্যাপচার বা আংশিকভাবে ক্যাপচার হয়ে যাবে এবং অন্য পুনঃনির্দেশে প্রেরিত আউটপুট নষ্ট হবে। 2 অপারেটিং সিস্টেম কমান্ড সম্পর্কে অভিযোগ করবে এবং ফলাফলগুলি উভয়ই ক্যাপচার হবে না (পুরোপুরি)। 3 অপরিজ্ঞাত, অনাকাঙ্ক্ষিত, অপ্রত্যাশিত, অপ্রত্যাশিত আচরণ।

উইন্ডোজ 7 এবং সম্ভবত উইন্ডোজ ভিস্তা / 8/10 এবং সম্ভবত উইন্ডোজ এক্সপিতে অপারেটিং সিস্টেম কমান্ড সম্পর্কে অভিযোগ করবে এবং কমান্ডটি বাতিল হয়ে যাবে।

উদাহরণস্বরূপ (উইন্ডোজ)): আমার নামের একটি ফোল্ডার রয়েছে: "C:\Temp\emptyfolder"এবং "নাইরেস্টিভেন্টিফিল" নামের একটি ফাইল সেখানে নেই।

C:\>cd "\Temp\emptyfolder"

C:\Temp\emptyfolder>dir nonexistantfile>output.txt
File Not Found

C:\Temp\emptyfolder>type output.txt
 Volume in drive F is FFFFx1tb
 Volume Serial Number is 4011-A5C6

 Directory of C:\Temp\emptyfolder

C:\Temp\emptyfolder>

এই ক্ষেত্রে, একটি পুনঃনির্দেশ ( >output.txt) ব্যবহার করে , dirকমান্ডের আউটপুট ফাইলটি ধারণ করে: output.txtএবং ত্রুটি বার্তাটি File Not Foundস্ক্রিনে প্রদর্শিত হয় ... এটি প্রত্যাশিত আচরণ।

এখন, উভয়ই পুনঃনির্দেশ ("> ফাইল" এবং "2> ফাইল") ব্যবহার করে:

C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>output.txt
The process cannot access the file because it is being used by another process.
C:\Temp\emptyfolder>type output.txt

C:\Temp\emptyfolder>

এই ক্ষেত্রে, অপারেটিং সিস্টেমটি অভিযোগ করেছে যে (আউটআউট) ফাইলটি ইতিমধ্যে ব্যবহৃত। এবং "আউটপুট.টিএসটিএক্স" ফাইলটি খালি (0 বাইট) শেষ হয়ে যায় এবং পুনঃনির্দেশগুলির উভয়েরই আউটপুট হারিয়ে যায়।

এখন, শেষ অবধি, উভয়ই পুনর্নির্দেশগুলি (">" ফাইল "এবং" 2> & 1 ") ব্যবহার করে:

C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>&1

C:\Temp\emptyfolder>type output.txt
 Volume in drive C is CCCCCCCC
 Volume Serial Number is 1234-ABCD

 Directory of C:\Temp\emptyfolder

File Not Found

C:\Temp\emptyfolder>

এই ক্ষেত্রে, "> ফাইল" "স্ট্রিম 1" ("স্ট্যান্ডার্ড আউটপুট") এর আউটপুটটিকে ফাইলের কাছে ধরা দেয়। এবং "2> & 1" "স্ট্রিম 2" ("ত্রুটি আউটপুট") এর জন্য আউটপুটটিকে ইতিমধ্যে পুনঃনির্দেশিত "স্ট্রিম 1" এর মাধ্যমে প্রেরণ এবং (একই) ফাইলে ক্যাপচারের কারণ করে।

এটিও গুরুত্বপূর্ণ যে অর্ডারটি গুরুত্বপূর্ণ। অর্ডারটি এর বিপরীতে:

dir nonexistant 2>&1 >output.txt

একই নয় এবং সম্ভবত আপনাকে পছন্দসই ফলাফল দেবে না।

এই ক্ষেত্রে, "2> & 1", যা আগে দেখা এবং পূর্ববর্তী করা হয়, "স্ট্রিম 2" ("ত্রুটি আউটপুট") এর জন্য আউটপুটটি যেখানে "স্ট্রিম 1" বর্তমানে নির্দেশিত হয়েছে সেখানে পুনঃনির্দেশিত করে মুহূর্তটি, (ডিফল্টরূপে), পর্দা। এবং "> ফাইল" "স্ট্রিম 1" ("স্ট্যান্ডার্ড আউটপুট") এর আউটপুট ফাইলটিতে ধারণ করে। শেষ ফলাফলটি হ'ল কমান্ডের আউটপুট ("স্ট্রিম 1") ফাইলটিতে ধরা পড়বে, তবে ত্রুটি আউটপুট ("স্ট্রিম 2") এখনও পর্দায় যাবে (ফাইলটিতে নয়)।


দেখা যাচ্ছে যে foo.exe>"c:\test.txt"আসলে কাজ করেন, কিন্তু এটা একটি ত্রুটি যে প্রোগ্রাম ক্র্যাশ (আউটপুট এখনও আছে যদিও ছিল না) ফেলে দিল। যাইহোক, আপনার পরামর্শটি 2>&1ক্র্যাশের অভিযোগ দূরে যাওয়ার কারণে এটি আরও উন্নত হয়েছে। এটি কী করে তা বিশদ দেওয়ার জন্য যত্নশীল? একটি দুর্দান্ত উত্তরের জন্য আবার ধন্যবাদ।
pzkpfw

@ bigbadonk420 - আমি ব্যবহার সম্পর্কে তথ্য অন্তর্ভুক্ত করতে আমার উত্তর আপডেট করেছি 2>&1। আপনি যদি আপনার ফাইল "সি: \ test.txt" পরীক্ষা করেন, আপনি সম্ভবত দেখতে পাবেন যে "ক্র্যাশ অভিযোগ" ফাইলটিতে লেখা হয়েছিল। 2>&1প্রোগ্রামটিকে ক্রাশ হওয়ার কারণ বা প্রতিরোধ করা উচিত নয়, এটি ত্রুটি বার্তাগুলি প্রদর্শিত না হয়ে ক্যাপচারের কারণ হয়ে দাঁড়ায়।
কেভিন ফেগান

1
ভাল, কিছু কারণে এটি।
pzkpfw

1
@ বিগবাডংক ৪২০ - 'for some reason it does'কোন দিক থেকে এটি পুনঃনির্দেশ দ্বারা প্রভাবিত? আপনি কি বলছেন যে আপনি যখন পুনর্নির্দেশ করবেন তখন 2>&1ত্রুটিটি ঘটে না? ত্রুটি দেখা দিলে আপনি কোন ত্রুটি বার্তাটি দেখছেন?
কেভিন ফেগান 16

1
যখন 2>&1অন্তর্ভুক্ত করা হয় না, প্রোগ্রামটি ক্র্যাশ হয়ে যায় এবং আমি স্ট্যান্ডার্ড উইন্ডোজটি "এই প্রোগ্রামটির প্রতিক্রিয়া বন্ধ করে দেওয়া হয়েছে" ডায়ালগটি পাই। আমি যখন এটি অন্তর্ভুক্ত করি তখন তা হয় না। কেন জানি না। যদিও উভয় ক্ষেত্রেই আউটপুট উত্পন্ন হয়।
pzkpfw
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.