ব্যাচ ফাইলের মধ্যে থেকে আউটপুট পুনঃনির্দেশ করা হচ্ছে


110

আমি সিস্টেম থেকে তথ্য সংগ্রহের জন্য কিছু সাধারণ কমান্ড সহ একটি ব্যাচ ফাইল তৈরি করছি। ব্যাচ ফাইলে সময়, আইপি তথ্য, ব্যবহারকারী ইত্যাদির জন্য আদেশ রয়েছে

আমি একটি ব্যাচ ফাইলে সমস্ত কমান্ড একত্রিত করেছি এবং এটি চলে, তবে আমি ব্যাচ ফাইলটি পছন্দ করতে চাইলে ফলাফলটি কোনও পাঠ্য ফাইলে (লগ) আউটপুট চালানোর সময় চালাতে পারি। এমন একটি আদেশ আছে যা আমি ব্যাচটিতে যুক্ত করতে পারি যা এটি করবে?

মনে রাখবেন আমি ব্যাচটি সেন্টিমিডি থেকে চালাতে চাই না, তারপরে আউটপুট পুনঃনির্দেশ করুন; আমি যদি ব্যাচের ভিতরে থেকে আউটপুট পুনর্নির্দেশ করতে চাই, যদি এটি সম্ভব হয়।

উত্তর:


161

সহজ সরল উপায়টি ধীর কারণ এটি ফাইল পয়েন্টারটি একাধিকবার এন্ড-অফ-ফাইলের কাছে খোলে এবং অবস্থান করে।

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

একটি আরও ভাল উপায় - সহজেই লেখা যায় এবং দ্রুত কারণ ফাইলটি একবারে খোলা থাকে এবং অবস্থান হয়।

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

আরেকটি ভাল এবং দ্রুত উপায় যা কেবল একবার ফাইলটি খোলায় এবং অবস্থান করে

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN

2020-04-17 সম্পাদনা করুন

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

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b

আমি হ্যান্ডলগুলি 9 এবং 8 টি বিপরীত ক্রমে ব্যবহার করা পছন্দ করেছি কারণ একই কমান্ডে একাধিক পুনঃনির্দেশগুলি সম্পাদন করার সময় কোনও মাইক্রোসফ্ট পুনর্নির্দেশকরণ বাস্তবায়ন ডিজাইনের ত্রুটির কারণে সেই উপায়টি সম্ভাব্য স্থায়ী পুনঃনির্দেশটিকে এড়াতে পারে । এটি অত্যন্ত অসম্ভব, তবে এমনকি যদি আপনি যথেষ্ট চেষ্টা করেন তবে এই পদ্ধতির মাধ্যমে বাগটি প্রকাশ করতে পারে। যদি আপনি সমস্যাটি এড়াতে আপনার গ্যারান্টিযুক্তের চেয়ে পুনর্নির্দেশটি মঞ্চস্থ করেন।

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.

2
সমাধানগুলি যেখানে আমি এটি ফাইলের বাকী অংশের জন্য নির্ধারণ করতে পারি
স্যাম

3
নোট করুন কল কলটি আপনার % 0 ( এই ক্ষেত্রে সাবতে ) পরিবর্তন করে যা আপনি যা চান তা হতে পারে বা নাও পারে।
জেনেস

1
@ জানেস - সত্য, তবে আপনি যদি কোনও সংশোধক যোগ করেন তবে আপনি সর্বদা চলমান ব্যাচ স্ক্রিপ্ট সম্পর্কে তথ্য পেতে পারেন। উদাহরণস্বরূপ, %~f0কোনও কল: সাববুটিনের ভিতরে থাকা অবস্থায়ও সর্বদা ব্যাচ স্ক্রিপ্টকে পুরো পথ দেয়।
dbenham

3
@ থারিকুনগ্রোহোটোমো ->output.txt 2>&1
ডিবেনহাম

2
@ মুন্ড্রা - একই স্ক্রিপ্টের মধ্যে লেবেলযুক্ত সাব্রোটিন কল করার জন্য এটি স্ট্যান্ডার্ড ব্যাচ সিনট্যাক্স। ডকুমেন্টেশনের জন্য কনসোল কমান্ড লাইনটি সম্পাদন করুন cmd /?বা help cmdথেকে করুন। তৃতীয় পদ্ধতির কৌশলটি হ'ল CALL এ পুনর্নির্দেশটি CALLed সাব্রোটিনের মধ্যে সমস্ত কমান্ডের জন্য প্রযোজ্য।
dbenham

66

যদি আপনি উভয়ই বাইরে যেতে চান এবং ভুল স্ট্রিমগুলি পুনঃনির্দেশিত করতে চান

dir >> a.txt 2>&1

27
+1 টি। এটি উল্লেখ করাও মূল্যবান যে >>ব্যবহারটি সংযোজন করবে a.txta.txtপরিবর্তে ওভাররাইট করতে, ব্যবহার করুন >stackoverflow.com/q/4458231/1098302
অ্যারন

হাই, কনসোলে আউটপুটটিকেও পুনর্নির্দেশ করার কোনও উপায় আছে?
সন্দীপ সিংহ

এটি কী করে তা
কলপেশ সনি

16

আমি জানি এটি একটি পুরানো পোস্ট, তবে গুগল অনুসন্ধানে কেউ এটির পিছনে হোঁচট খাবে এবং এমনও দেখা যাচ্ছে যে মন্তব্যগুলিতে ওপি জিজ্ঞাসা করেছিল এমন কিছু প্রশ্ন বিশেষভাবে সম্বোধন করা হয়নি। এছাড়াও, দয়া করে আমার উপর সহজ হোন কারণ এটি আমার প্রথম পোস্টটি এসওতে পোস্ট করা হয়েছে। :)

গতিশীলভাবে উত্পন্ন ফাইলের নাম ব্যবহার করে আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করতে, আমার যেতে (পড়ুন: দ্রুত এবং নোংরা) পদ্ধতির হ'ল @ ডবেনহ্যাম প্রস্তাবিত দ্বিতীয় সমাধান। সুতরাং উদাহরণস্বরূপ, এটি:

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

লক্ষ্য ডিরেক্টরিতে ফাইলটির এই স্ক্রিনশটে আপনি যা দেখেন তার মতো একটি ফাইল তৈরি করবে

এতে এই আউটপুট থাকবে:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

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


ধন্যবাদ এটি দরকারী ছিল। আপনি কেন লগ বনাম .txt ব্যবহার করছেন তাড়াতাড়ি কোনও প্রশ্ন রয়েছে? এটা কি কোন পার্থক্য তৈরি করবে?
মুন্দ্রা

1
@ মুন্ড্রা না এটি করেনা। এটি কেবল এই ক্ষেত্রে শব্দার্থবিজ্ঞান। এটি বলার অপেক্ষা রাখে না যে এমন কোনও অ্যাপ্লিকেশন নেই যা ফাইল টাইপের উপর ভিত্তি করে / গ্রেপ প্রয়োজন, সুতরাং / কীভাবে আপনার ফাইলগুলি ব্যবহৃত হচ্ছে তা সম্পর্কে সচেতন হন।
অ্যান্টনি

9
echo some output >"your logfile"

অথবা

(
 echo some output
 echo more output
)>"Your logfile"

বিলটি পূরণ করা উচিত

আপনি যদি APPENDআউটপুট করতে চান তবে এর >>পরিবর্তে ব্যবহার করুন >>একটি নতুন লগফিল শুরু হবে।


9
@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause

আমি মনে করি এটি সবচেয়ে মার্জিত উপায়। ধন্যবাদ ওয়েসলি!
কিসওয়ানিজ

5

একটি দুর্দান্ত ছোট প্রোগ্রাম রয়েছে যা আপনি কোনও ফাইল এবং কনসোলে আউটপুট পুনর্নির্দেশ করতে ব্যবহার করতে পারেন

some_command  ^|  TEE.BAT  [ -a ]  filename 


3
@echo OFF
[your command] >> [Your log file name].txt

আমি আমার ব্যাচ ফাইলে উপরের কমান্ডটি ব্যবহার করেছি এবং এটি কাজ করে। লগ ফাইলে এটি আমার কমান্ডের ফলাফলগুলি দেখায়।


3

আপনার ব্যাচ ফাইলের শীর্ষের নিকটে এই দুটি লাইন যুক্ত করুন, সমস্ত স্টডআউট এবং স্ট্ডার পরে লগইন.টিএসটিএরে পুনঃনির্দেশিত হবে:

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1

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

হাই, আপনার উত্তরের জন্য ধন্যবাদ! এটিকে কনসোলে পুনর্নির্দেশ করার কোনও উপায় আছে কি?
সন্দীপ সিংহ

0

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


0

আপনার ব্যাচ ফাইলের নীচে নীচের লাইনগুলি যুক্ত করা সিএমডি উইন্ডোর অভ্যন্তরে প্রদর্শিত সমস্ত কিছু হ্রাস করে একটি পাঠ্য ফাইলে রফতানি করবে:

powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^a')
powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^c')
powershell Get-Clipboard > MyLog.txt

এটি মূলত একটি নির্বাচিত সমস্ত সম্পাদন করে -> ক্লিপবোর্ডে অনুলিপি -> পাঠ্য ফাইলে পেস্ট করুন

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