আমি ব্যাট স্ক্রিপ্টে কোনও ফাইলটিতে কনসোল আউটপুটটি কীভাবে ইকো করব এবং প্রেরণ করব?


136

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

উদাহরণ স্বরূপ:

c:\Windows>dir > windows-dir.txt

dirকনসোল উইন্ডোতে প্রদর্শনের আউটপুট পাশাপাশি পাঠ্য ফাইলে রাখার উপায় আছে কি?


আপনি করতে পারেন এমন পুনর্নির্দেশগুলি এবং কয়েকটি উদাহরণ এখানে ব্যাখ্যা করা হয়েছে <br> <br> আশা করি এটি সাহায্য করবে :)
ইমোস্টএন


দয়া করে নোট করুন, @ ভাদজিম, যে ফেব্রুয়ারী 2, 2009-এ 16:38 এ জিজ্ঞাসা করা প্রশ্নটি প্রায় তিন মাস পরে ২৮ শে এপ্রিল, ২০০৯ এ 06:32 এ জিজ্ঞাসিত একটি প্রশ্নের সদৃশ বলে গণ্য হবে না?
কমপো

উত্তর:


216

না, আপনি খাঁটি পুনঃনির্দেশ দিয়ে পারবেন না।
তবে কিছু কৌশল (যেমন tee.bat ) দিয়ে আপনি পারেন।

আমি পুনঃনির্দেশটি কিছুটা ব্যাখ্যা করার চেষ্টা করি।

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

dir > file.txt
> file.txt dir

এই উদাহরণে পুনঃনির্দেশটি 1> এর জন্য কেবল একটি শর্টকাট , এর অর্থ স্ট্রিম 1 (STDOUT) পুনঃনির্দেশিত হবে।
সুতরাং আপনি 2> err.txt এর মতো সংখ্যার প্রিপেন্ডিং সহ যে কোনও প্রবাহকে পুনর্নির্দেশ করতে পারেন এবং এটি এক লাইনে একাধিক স্ট্রিমগুলি পুনর্নির্দেশেরও অনুমতিপ্রাপ্ত।

dir 1> files.txt 2> err.txt 3> nothing.txt

এই উদাহরণে "স্ট্যান্ডার্ড আউটপুট" ফাইল.txt এ যাবে, সমস্ত ত্রুটিগুলি err.txt এ হবে এবং স্ট্রিম 3 কিছুই. টেক্সটে যাবে (ডিআইআর 3 স্ট্রিমটি ব্যবহার করে না)।
স্ট্রিম0 টি স্টিডিন
স্ট্রিম
1 হ'ল স্ট্রোড
স্ট্রিম 2 এসটিডিআরআর স্ট্রিম 3-9 ব্যবহৃত হয় না

তবে আপনি যদি একই স্ট্রিমটিকে একাধিকবার পুনঃনির্দেশ করার চেষ্টা করেন তবে কী হবে?

dir > files.txt > two.txt

"কেবলমাত্র একজনই থাকতে পারে", এবং সর্বদা এটি সর্বশেষ!
সুতরাং এটি dir> two.txt এর সমান

ঠিক আছে, আরও একটি সম্ভাবনা রয়েছে, একটি স্ট্রিমকে অন্য স্ট্রিমে রিডাইরেক্ট করে।

dir 1>files.txt 2>&1 

2> & 1 পুনঃনির্দেশ stream2 করার stream1 এবং 1> files.txt পুনঃনির্দেশ সব থেকে files.txt
অর্ডার এখানে গুরুত্বপূর্ণ!

dir ... 1>nul 2>&1
dir ... 2>&1 1>nul

ভিন্ন. প্রথমটি সমস্তগুলিকে (STDOUT এবং STDERR) NUL এ
পুনঃনির্দেশ করে তবে দ্বিতীয় লাইনটি STDOUT থেকে NUL এবং STDERR এ "খালি" STDOUT এ পুনঃনির্দেশ করে।

একটি উপসংহার হিসাবে, এটি স্পষ্ট যে কেন ওটিভিও ডেক্সিও এবং অ্যান্ডনোরম্যান্যাক্সের উদাহরণগুলি কাজ করতে পারে না।

command > file >&1
dir > file.txt >&2

দু'জনই স্ট্রিম 1টিকে দুটিবার পুনঃনির্দেশ করার চেষ্টা করে, তবে "কেবলমাত্র একজনই থাকতে পারে", এবং এটি সর্বদা শেষ।
সুতরাং আপনি পেতে

command 1>&1
dir 1>&2

এবং প্রথম নমুনায় স্ট্রিম 1-কে স্ট্রিম 1 এ পুনঃনির্দেশ করার অনুমতি নেই (এবং খুব দরকারী নয়)।

আশা করি এটা সাহায্য করবে.


24
সুতরাং দেশীয় উইন্ডোজ শেল দিয়ে এটি অসম্ভব
চমত্কার

7
@fantastory এটা সম্ভব, dbenham এর এই মহান সমাধান দেখতে 'টী বর্ণের নাম' কম্যান্ড: উইন্ডোজ ব্যাচ
Jeb

97
আমি বিশ্বাস করতে পারি না যে পুরো জিনিসটি "না" হিসাবে সংক্ষিপ্ত করা যেতে পারে আমি এই পুরো পোস্টটি পড়েছি read
চার্লস ম্যাককেলভে

1
দ্বিতীয় প্রক্রিয়া "হ্যান্ডেল সদৃশ" সম্পর্কে কী? আমি পরীক্ষা করেছিলাম 3<&2(জিটির পরিবর্তে এলটি নোট করুন) এবং তারপরেও 3>errors.txt। তবে এটি খারাপভাবে শেষ হয়েছিল - পরবর্তী সমস্ত স্টার্ডার আউটপুট ক্যাপচার করা হয়েছিল errors.txt(এটি - অন্যান্য কমান্ড থেকেও!)।
টমাসজ গ্যান্ডার

আপনি for /f "delims=" %%v in ('dir') do echo %%v>>file.txtযদিও ব্যবহার করতে পারেন ।
স্ক্রিপ্টমেস্টে 02

32

ইউনিক্স টি কমান্ডের উইন্ডোজ সংস্করণটি ( http://unxutils.sourceforge.net থেকে পাওয়া ) কেবল এইভাবে ব্যবহার করুন:

mycommand > tee outpu_file.txt

আপনার যদি এসটিডিআরআর আউটপুট প্রয়োজন হয় তবে নিম্নলিখিতগুলি ব্যবহার করুন। Stdout- এ মধ্যে stderr আউটপুট (মুখ্য স্ট্রীম) সম্মিলন।
2>&1

mycommand 2>&1 | tee output_file.txt

3
PowerShell টী-বস্তুর অফার অনুরূপ কার্যকারিতা। গেট-প্রক্রিয়া | টি-অবজেক্ট-ফাইল ফাইল সি: \ স্ক্রিপ্টস \ পরীক্ষা.টেক্সট
কেভিন ওবি

আমি পাওয়ারশেল এবং নিয়মিত শেল উভয়েই এটি চেষ্টা করেছি। কমান্ড কল না করে 1>tee a.txtstdout নামের একটি ফাইলে পুনর্নির্দেশ করবে । এই উত্তরটি কি তাদের পক্ষে কাজ করে তা নিশ্চিত করতে পারেন? teetee
মাফু

@ মাফু আমি এটি নিশ্চিত করতে পারি।
কর্নো

@ মাফু উপরের উত্তরটি সামান্য বিরল। আপনাকে পাইপটি ব্যবহার করতে হবে "|" শীর্ষ উদাহরণে ">" এর পরিবর্তে। অদ্ভুতভাবে, STDOUT এবং STDERR আউটপুট ক্রম সেই ক্ষেত্রে কমান্ড লাইনে মিশ্রিত হয়েছিল। নীচের উদাহরণটি যদিও আমার জন্য নিখুঁতভাবে কাজ করে।
Cerno

এছাড়াও, সোর্সফোর্জ ডাউনলোডটি আমার জন্য ভেঙে দেওয়া হয়েছিল। আমি এখানে একটি বিকল্প হোস্ট পেয়েছি: wzw.tum.de/public-html/syring/win32/UnxUtilsDist.html (মিউনিখ বিশ্ববিদ্যালয়)
Cerno

9

আপনার যদি আসল সময়ে আউটপুটটির প্রয়োজন না হয় (যেমন প্রোগ্রামটি এটি লিখছে) আপনি যুক্ত করতে পারেন

type windows-dir.txt

যে লাইনের পরে।


বা একই লাইনে (প্রম্পটে দরকারী) : dir > windows-dir.txt & type windows-dir.txt. এই ব্লক ক্ষেত্রে প্রযোজ্য: ( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt। তবে, যদি আউটপুটটি বাস্তব সময়ে প্রয়োজন হয় তবে আপনি উদাহরণস্বরূপ টি সরঞ্জামটির একটি উইন্ডো পোর্ট ব্যবহার করতে পারেন …
মউসিও

7

আমার জন্য যে সমাধানটি কাজ করেছিল তা হ'ল: dir> a.txt | টাইপ a.txt


2
এটি কম আউটপুট সহ কমান্ডের সাথে কাজ করে। বৃহত আউটপুট কমান্ডের সাহায্যে এটি কাজ করে না কারণ এটি কেবল প্রথম বাফার দেখায়। লগ ফাইলে আউটপুট সংরক্ষণের সময় তিনি আসল সময়ের আউটপুট চেয়েছেন।
নেটভিচিস

আপনি যদি>> এর পরিবর্তে>
নাইমে ক্লাউড

6

হ্যাঁ, কনসোল (স্ক্রিন) এবং একটি ফাইলে একটি একক কমান্ড আউটপুট দেখানোর উপায় রয়েছে। আপনার উদাহরণ ব্যবহার করে, ব্যবহার করুন ...

@ECHO OFF
FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txt

বিস্তারিত ব্যাখ্যা:

FORকমান্ড একটি পরিবর্তনশীল, একাধিক বার উল্লেখ করা যেতে পারে যা কমান্ড বা পাঠ্য আউটপুট parses।

একটি কমান্ডের জন্য, যেমন DIR /B, নীচের উদাহরণ হিসাবে প্রদর্শিত একক উদ্ধৃতিতে আবদ্ধ করুন। DIR /Bআপনার পছন্দসই কমান্ড দিয়ে পাঠ্যটি প্রতিস্থাপন করুন ।

FOR /F "tokens=*" %%I IN ('DIR /B') DO ECHO %%I & ECHO %%I>>FILE.TXT

পাঠ্য প্রদর্শন করার জন্য, নীচের উদাহরণে প্রদর্শিত হিসাবে ডাবল উদ্ধৃতিতে পাঠ্যটি আবদ্ধ করুন।

FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ECHO %%I & ECHO %%I>>FILE.TXT

... এবং লাইন মোড়ক দিয়ে ...

FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO (
  ECHO %%I & ECHO %%I>>FILE.TXT
)

আপনার যদি এমন সময় আসে যখন আপনি কেবল কনসোল (স্ক্রিন) এ আউটপুট চান এবং অন্য সময় কেবল ফাইলের জন্য প্রেরণ করা হয় এবং অন্য সময় উভয়কে প্রেরণ করা হয় তবে নীচের সাথে দেখানো মত একটি ভেরিয়েবল ব্যবহার করে ফর লুপের "ডিও" ধারাটি নির্দিষ্ট করুন %TOECHOWHERE%

@ECHO OFF
FOR %%I IN (TRUE FALSE) DO (
  FOR %%J IN (TRUE FALSE) DO (
    SET TOSCREEN=%%I & SET TOFILE=%%J & CALL :Runit)
)
GOTO :Finish

:Runit
  REM Both TOSCREEN and TOFILE get assigned a trailing space in the FOR loops
  REM above when the FOR loops are evaluating the first item in the list,
  REM "TRUE".  So, the first value of TOSCREEN is "TRUE " (with a trailing
  REM space), the second value is "FALSE" (no trailing or leading space).
  REM Adding the ": =" text after "TOSCREEN" tells the command processor to
  REM remove all spaces from the value in the "TOSCREEN" variable.
  IF "%TOSCREEN: =%"=="TRUE" (
      IF "%TOFILE: =%"=="TRUE" (
          SET TEXT=On screen, and in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I & ECHO %%I>>FILE.TXT"
        ) ELSE (
          SET TEXT=On screen, not in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I"
      )
    ) ELSE (
      IF "%TOFILE: =%"=="TRUE" (
          SET TEXT=Not on screen, but in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I>>FILE.txt"
        ) ELSE (
          SET TEXT=Not on screen, nor in "FILE.TXT"
          SET TOECHOWHERE="ECHO %%I>NUL"
      )
  )
  FOR /F "tokens=*" %%I IN ("%TEXT%") DO %TOECHOWHERE:~1,-1%
GOTO :eof

:Finish
  ECHO Finished [this text to console (screen) only].
  PAUSE

delims=পরিবর্তে আপনার ব্যবহার করা উচিত ।
স্ক্রিপ্টমেস্টে 02

3
command > file >&1

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

@andynormancx yup সিএমডি থেকে কেটে পেস্ট না করে টাইপ করতে ভুলে গিয়েছে।
এলোমেলো বিকাশকারী

উইন্ডোজ কমান্ড প্রম্পটের অধীনে কাজ করতে সিনট্যাক্সটি পেলাম না এবং পরিবর্তে টাইপ কমান্ড দিয়ে গিয়েছি।
জেমস এগার্স

& 2 কাজ করে তবে ফাইলটি এখন পরীক্ষিত হওয়ার পরে তৈরি হচ্ছে না।
জেমস এগার্স

5
যদি আমি "dir> file.txt> & 2" করি তবে file.txt তৈরি হচ্ছে না। ডিরেক্টরিটির আউটপুট কনসোলে প্রতিধ্বনিত হচ্ছে তবে ফাইলটি তৈরি হচ্ছে না। "> & 2" উপস্থিত না থাকলে ফাইলটি তৈরি করা হয়।
জেমস এগার্স

2

আপনি যদি আউটপুট ফাইলটি প্রতিস্থাপনের পরিবর্তে সংযোজন করতে চান তবে আপনি ব্যবহার করতে পারেন

dir 1>> files.txt 2>> err.txt

অথবা

dir 1>> files.txt 2>>&1

2

আমার বিকল্পটি ছিল:

একটি সাবরোটাইন তৈরি করুন যা বার্তাটি নেয় এবং এটি কনসোল এবং লগ ফাইল উভয়কে প্রেরণের প্রক্রিয়াটিকে স্বয়ংক্রিয় করে দেয়।

setlocal
set logfile=logfile.log

call :screenandlog "%DATE% %TIME% This message goes to the screen and to the log"    

goto :eof

:screenandlog
set message=%~1
echo %message% & echo %message% >> %logfile%
exit /b

আপনি যদি বার্তায় কোনও পরিবর্তনশীল যুক্ত করেন তবে সাব্রোটিনে প্রেরণের আগে এটিতে উদ্ধৃতিগুলি সরিয়ে ফেলার বিষয়ে নিশ্চিত হন বা এটি আপনার ব্যাচটিকে স্ক্রু করতে পারে। অবশ্যই এটি কেবল প্রতিধ্বনির জন্য কাজ করে।


হ্যাঁ! আমি সত্যিই এটি পছন্দ করি!! যদিও আমি তিনটি পরিবর্তন করেছি, আশা করি আপনি তাদের পছন্দ করবেন। 1) আমি setlocal enabledelayedexpansionকেবল setlocal 2 এর পরিবর্তে ব্যবহার করি ) আমি লগফাইলে পরিবর্তনশীলটির জন্য বিলম্বিত সম্প্রসারণটি ব্যবহার করি, তাই সাব্রোটিনের >> !logfile!পরিবর্তে >> %logfile%। এইভাবে, কোনও কোড ব্লকের মধ্যে থেকে কল করা হলে এটি কাজ করে (যেমন যদি বিবৃতিতে থাকে)। 3) অতিরিক্ত সীমাবদ্ধতার প্রয়োজন নেই বলে আমি "সেট বার্তা" লাইনটি সরিয়েছি। আমাদের ইতিমধ্যে এটি রয়েছে $~1তাই আমার কাছে echo $~1উভয় ইকো কমান্ড রয়েছে।
নট

2

আমি একটি সাধারণ সি # কনসোল তৈরি করেছি যা উভয় সেন্টিমিডি স্ক্রিন এবং লগতে রিয়েল-টাইম আউটপুট পরিচালনা করতে পারে

class Tee
{
    static int Main(string[] args)
    {
        try
        {
            string logFilePath = Path.GetFullPath(args[0]);

            using (StreamWriter writer = new StreamWriter(logFilePath, true))
            {
                for (int value; (value = Console.In.Read()) != -1;)
                {
                    var word = Char.ConvertFromUtf32(value);
                    Console.Write(word);
                    writer.Write(word);
                }
            }
        }
        catch (Exception)
        {
            return 1;
        }
        return 0;
    }
}

ব্যাচ ফাইলের ব্যবহার আপনি ইউনিক্স কীভাবে ব্যবহার করেন তার সমান tee

foo | tee xxx.log

এবং এখানে আপনার কাছে https://github.com/iamshiao/Tee সংকলনের সরঞ্জাম না থাকলে Tee.exe অন্তর্ভুক্ত এমন সংগ্রহস্থলটি এখানে রয়েছে


1

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


0

"টমাস আর" দ্বারা সরবরাহিত সমাধানটি ওপির প্রশ্নের জন্য নিখুঁতভাবে কাজ করে এবং এটি স্থানীয়ভাবে উপলব্ধ।

চেষ্টা করুন: chkdsk c:> output.txt | টাইপ আউটপুট.টেক্সট

আউটপুটটি এই কমান্ডের একটি সমাপ্তি শতাংশ জড়িত যা ফাইলটিতে ক্রমিক আউটপুট পায় তাই এটি কিছুটা অগোছালো দেখাবে (যেমন পাঠটি অগ্রগতির সাথে যুক্ত হবে)। এটি বিটগুলির সাথে ঘটে না যা STDOUT (স্ক্রিন) এ আউটপুট পায়। আপনি যদি পুনঃনির্দেশ ছাড়াই একই কমান্ডটি করেন তবে এটি কেমন হয়।


-3

আমি মনে করি আপনি এর লাইন বরাবর কিছু চান:

echo Your Msg> YourTxtFile.txt

অথবা আপনি যদি নতুন লাইন চান:

echo Your Msg>> YourTxtFile.txt

এই আদেশগুলি লগ জন্য দুর্দান্ত।

দ্রষ্টব্য: এটি কখনও কখনও আমার কম্পিউটারে পুরো পাঠ্য ফাইলটি ভুল করে প্রতিস্থাপন করবে।

অন্য দ্রষ্টব্য: যদি ফাইলটি না থাকে তবে এটি ফাইলটি তৈরি করবে।


1
না, ওপি আউটপুটটিকে একটি ফাইল এবং স্ক্রিনে রাখতে চেয়েছিল । আপনার কেবল ফাইল করার জন্য লেখেন। (এবং >করা হয় পরিকল্পিত ফাইলটি প্রতিস্থাপন ব্যবহার করুন। >>থেকে যোগ )
স্টিফেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.