একটি এমএস ব্যাচ ফাইল ব্যবহার করে একটি চলকের একটি প্রোগ্রামের আউটপুট বরাদ্দ করুন


290

আমাকে একটি এমএস ব্যাচ ফাইল ব্যবহার করে একটি প্রোগ্রামের আউটপুট ভেরিয়েবলের কাছে বরাদ্দ করতে হবে।

সুতরাং জিএনইউ বাশ শেলটিতে আমি ব্যবহার করব VAR=$(application arg0 arg1)। ব্যাচের ফাইল ব্যবহার করে আমার উইন্ডোজে অনুরূপ আচরণ প্রয়োজন।

কিছু একটা set VAR=application arg0 arg1

উত্তর:


433

একটি উপায়:

application arg0 arg1 > temp.txt
set /p VAR=<temp.txt

আরেকটি হ'ল:

for /f %%i in ('application arg0 arg1') do set VAR=%%i

নোট যে প্রথম %মধ্যে %%iঅব্যাহতি ব্যবহার করা হয় %পরে এবং যখন একটি ব্যাচ ফাইলে বদলে কমান্ড লাইন উপরে কোড ব্যবহার প্রয়োজন হয়। ভাবুন, আপনার test.batমতো কিছু রয়েছে:

for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i
echo %datetime%

11
এটি একটি দুর্দান্ত কৌশল, আমি আশ্চর্য হয়েছি কেন এটি পাইপ দিয়ে কাজ করে না
বিল কে

25
এটি কেবলমাত্র আউটপুট জন্য কাজ করে যা পাঠের একক লাইন (পরবর্তী লাইনগুলি প্রথম লাইন বিরতির পরে বাদ দেওয়া হয়)।
গ্রোভিকেকস

20
@ মাছতা পাইপটি পেরেন্সের অভিব্যক্তির ভিতরে অবশ্যই তার আগে একটি চিহ্ন দিয়ে পালাতে হবে। উদাহরণ:for /f "tokens=3" %%i in ('route print ^| findstr "\<0.0.0.0\>"') do set "myVar=%%i"
ইমানুয়েল দেল গ্র্যান্ড

8
স্পেসগুলির সাথে লাইনের জন্য কাজ করবেন না। উদাহরণস্বরূপ: / f %% i এর জন্য ('ver') VAR = %% i সেট করে। যেমন @ রেনাট লিখেছেন, "টোকেনগুলি = *" যুক্ত করা উচিত
ইউরা শিনকারেভ

2
@ গ্রোভিকেকস আপনার আউটপুটে একাধিক লাইন সম্পর্কে আপনার প্রশ্নের উত্তরটি একটি সদৃশ প্রশ্নে দেওয়া হয়েছে
আইসিসি

67

এই পূর্বের উত্তরের সংযোজন হিসাবে , পাইপগুলি বিবৃতি দেওয়ার জন্য কোনও ক্যারেটের প্রতীক দ্বারা পালিয়ে যায়:

    for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i

1
দুটি গুরুত্বপূর্ণ বিষয়: পাইপ থেকে বাঁচতে টোকেনগুলি ক্যাপচার করতে এবং ক্যারেট ব্যবহার করুন।
ক্রিস্টোফার ওয়েজব্যাক

6
সমান সংস্করণ যা সি এল এল এ কাজ করে এবং সহজে টিঙ্কারিংয়ের জন্য অনুলিপি করা যায়: for /f "tokens=*" %i in ('tasklist ^| findstr explorer') do @echo %iতবে সাধারণভাবে, usebackqজটিল কমান্ডগুলি পরিচালনা করতে ব্যবহার করা উচিত।
অমিত নাইডু

আউটপুট ফাঁকা স্থান পরিচালনা করার জন্য টোকেনগুলির প্রয়োজন ছিল।
মার্ক ইঙ্গ্রাম

দর আমার জন্য ভাল কাজ করুন, এরকম: for /f "tokens=*" %%i in ('"tasklist | grep explorer"') do set VAR=%%i। কমান্ড নিজেই কোনও উদ্ধৃতি না থাকলে আমার পক্ষে সহজ।
পল

10

@ ওপ, আপনি যদি আপনার প্রোগ্রামের রিটার্নের স্থিতি ক্যাপচার করতে লুপগুলি ব্যবহার করতে পারেন, যদি এটি সংখ্যা ছাড়া অন্য কিছু আউটপুট করে


8

ধরে নিই যে আপনার অ্যাপ্লিকেশনটির আউটপুট একটি সংখ্যার রিটার্ন কোড, আপনি নিম্নলিখিতটি করতে পারেন

application arg0 arg1
set VAR=%errorlevel%

5
দুর্ভাগ্যক্রমে, আউটপুট একটি স্ট্রিং।
প্রাথমিক জিরো

ঠিক আছে. আমি এটি উত্তরোত্তর জন্য রাখব, তবে @ jdigital এর লিঙ্কটি একবার দেখুন, যা কোনও অস্থায়ী ফাইলে পাইপ আউটপুট দেওয়ার বিষয়ে কথা বলে।
akf

1
Stdout এবং stderr এ প্রোগ্রামটির আউটপুট এটির পূর্ণসংখ্যার ফেরতের মান থেকে আলাদা। একটি প্রোগ্রাম উভয়ই উপরের উদাহরণের মতো পূর্ণসংখ্যা মানটি ফিরিয়ে দিতে পারে, পাশাপাশি কনসোলে একটি স্ট্রিং প্রেরণ করে (বা কোনও ফাইল বা অন্য কোথাও পুনঃনির্দেশিত)। এগুলি পারস্পরিক একচেটিয়া নয় এবং দুটি ভিন্ন ধারণা।
ডেভিড রেক্টর

7

কার্যকর করার সময়: for /f %%i in ('application arg0 arg1') do set VAR=%%iআমি ত্রুটি পাচ্ছিলাম: %% আমি এই সময়ে অপ্রত্যাশিত ছিলাম। একটি স্থির হিসাবে, আমি উপরে হিসাবে চালানো ছিলfor /f %i in ('application arg0 arg1') do set VAR=%i


9
একটি ব্যাচ ফাইলে আপনার প্রয়োজন হয় %%এবং একটি কমান্ড লাইনের একটি ব্যাচ ফাইলের বাইরে আপনার প্রয়োজন হয়%
জেরি যেরেমিয়া

2

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

for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O)

তথ্যসূত্র: ব্যাচ স্ক্রিপ্টের লুপের জন্য কমান্ডের পুনর্নির্দেশ আউটপুট


1
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM Prefer backtick usage for command output reading:
REM ENABLEDELAYEDEXPANSION is required for actualized
REM  outer variables within for's scope;
REM within for's scope, access to modified 
REM outer variable is done via !...! syntax.

SET CHP=C:\Windows\System32\chcp.com

FOR /F "usebackq tokens=1,2,3" %%i IN (`%CHP%`) DO (
    IF "%%i" == "Aktive" IF "%%j" == "Codepage:" (
        SET SELCP=%%k
        SET SELCP=!SELCP:~0,-1!
    )
)
echo actual codepage [%SELCP%]

ENDLOCAL

(প্লাস 1) ব্যাকটিক্স ব্যাখ্যার জন্য
স্যান্ডবার্গ

1

কমান্ড আউটপুটগুলি ক্যাপচার করার জন্য আপনি ব্যাচ ম্যাক্রো ব্যবহার করতে পারেন, যেমন ব্যাশ শেলের আচরণের মতো।

ম্যাক্রোর ব্যবহারটি সহজ এবং দেখতে দেখতে দুর্দান্ত

%$set% VAR=application arg1 arg2

এবং এটি পাইপ দিয়েও কাজ করে

%$set% allDrives="wmic logicaldisk get name /value | findstr "Name""

ম্যাক্রো একটি অ্যারের মতো চলকটি ব্যবহার করে এবং প্রতিটি লাইনকে পৃথক সূচকগুলিতে সঞ্চয় করে।
এর নমুনায় %$set% allDrives="wmic logicaldiskনিম্নলিখিত ভেরিয়েবলগুলি তৈরি করা হবে:

allDrives.Len=5
allDrives.Max=4
allDrives[0]=Name=C:
allDrives[1]=Name=D:
allDrives[2]=Name=F:
allDrives[3]=Name=G:
allDrives[4]=Name=Z:
allDrives=<contains the complete text with line feeds>

এটি ব্যবহার করার জন্য, ম্যাক্রো নিজে কীভাবে কাজ করে তা বোঝা গুরুত্বপূর্ণ নয়।

পুরো উদাহরণ

@echo off
setlocal

call :initMacro

%$set% ipOutput="ipconfig"
call :ShowVariable ipOutput
echo First line is %ipOutput[0]%

echo( 
%$set% driveNames="wmic logicaldisk get name /value | findstr "Name""
call :ShowVariable driveNames

exit /b

:ShowVariable
setlocal EnableDelayedExpansion
for /L %%n in (0 1 !%~1.max!) do (
    echo %%n: !%~1[%%n]!
)
echo(
exit /b

:initMacro
if "!!"=="" (
    echo ERROR: Delayed Expansion must be disabled while defining macros
    (goto) 2>nul
    (goto) 2>nul
)
(set LF=^
%=empty=%
)
(set \n=^^^
%=empty=%
)

set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n%
    setlocal EnableDelayedExpansion                                 %\n%
    for /f "tokens=1,* delims== " %%1 in ("!argv!") do (            %\n%
        endlocal                                                    %\n%
        endlocal                                                    %\n%
        set "%%~1.Len=0"                                            %\n%
        set "%%~1="                                                 %\n%
        if "!!"=="" (                                               %\n%
            %= Used if delayed expansion is enabled =%              %\n%
                setlocal DisableDelayedExpansion                    %\n%
                for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n%
                if "!!" NEQ "" (                                    %\n%
                    endlocal                                        %\n%
                    )                                               %\n%
                setlocal DisableDelayedExpansion                    %\n%
                set "line=%%O"                                      %\n%
                setlocal EnableDelayedExpansion                     %\n%
                set pathExt=:                                       %\n%
                set path=;                                          %\n%
                set "line=!line:^=^^!"                              %\n%
                set "line=!line:"=q"^""!"                           %\n%
                call set "line=%%line:^!=q""^!%%"                   %\n%
                set "line=!line:q""=^!"                             %\n%
                set "line="!line:*:=!""                             %\n%
                for /F %%C in ("!%%~1.Len!") do (                   %\n%
                    FOR /F "delims=" %%L in ("!line!") Do (         %\n%
                        endlocal                                    %\n%
                        endlocal                                    %\n%
                        set "%%~1[%%C]=%%~L" !                      %\n%
                        if %%C == 0 (                               %\n%
                            set "%%~1=%%~L" !                       %\n%
                        ) ELSE (                                    %\n%
                            set "%%~1=!%%~1!!LF!%%~L" !             %\n%
                        )                                           %\n%
                    )                                               %\n%
                    set /a %%~1.Len+=1                              %\n%
                )                                                   %\n%
            )                                                       %\n%
        ) ELSE (                                                    %\n%
            %= Used if delayed expansion is disabled =%             %\n%
            for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n%
                setlocal DisableDelayedExpansion                    %\n%
                set "line=%%O"                                      %\n%
                setlocal EnableDelayedExpansion                     %\n%
                set "line="!line:*:=!""                             %\n%
                for /F %%C in ("!%%~1.Len!") DO (                   %\n%
                    FOR /F "delims=" %%L in ("!line!") DO (         %\n%
                        endlocal                                    %\n%
                        endlocal                                    %\n%
                        set "%%~1[%%C]=%%~L"                        %\n%
                    )                                               %\n%
                    set /a %%~1.Len+=1                              %\n%
                )                                                   %\n%
            )                                                       %\n%
        )                                                           %\n%
        set /a %%~1.Max=%%~1.Len-1                                  %\n%
)                                                                   %\n%
    ) else setlocal DisableDelayedExpansion^&set argv=

goto :eof

0

আমি স্ক্রিপ্টটি লিখেছিলাম যা প্রতি 5 সেকেন্ডে গুগল ডটকমকে পিন করে এবং বর্তমান সময়ের সাথে ফলাফলগুলি লগ করে। এখানে আপনি ভেরিয়েবল "কমান্ডলাইনএসটিআর" (সূচক সহ) এর আউটপুট পেতে পারেন

@echo off

:LOOPSTART

echo %DATE:~0% %TIME:~0,8% >> Pingtest.log

SETLOCAL ENABLEDELAYEDEXPANSION
SET scriptCount=1
FOR /F "tokens=* USEBACKQ" %%F IN (`ping google.com -n 1`) DO (
  SET commandLineStr!scriptCount!=%%F
  SET /a scriptCount=!scriptCount!+1
)
@ECHO %commandLineStr1% >> PingTest.log
@ECHO %commandLineStr2% >> PingTest.log
ENDLOCAL

timeout 5 > nul

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