একটি ব্যাচ ফাইলে ভেরিয়েবল হিসাবে কমান্ড আউটপুট সেট করতে হয়


242

উত্তর:


275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

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

এখন যদি আপনার আউটপুটে একাধিক লাইন থাকে তবে আপনি এটি করতে পারেন

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL

3
উইন 7 সিস্টেমে আমার জন্য কাজ করেছেন, ধন্যবাদ! (এবং হ্যাঁ, এটি ব্যবহারকারীর 7 বছর) পিএস কমান্ডগুলিতে% থেকে %% প্রসারিত করতে ভুলবেন না!
দিমিত্রি ইলুখিন

এটি দুর্দান্ত কাজ করে ... যদি না আউটপুটে বিস্ময়কর বিন্দু (!) না থাকে, কারণ এগুলি ব্যবহার করার সময় নিয়ন্ত্রণ অক্ষর হিসাবে ব্যাখ্যা করা হবেENABLEDELAYEDEXPANSION
জোনাথন

এটি কার্যকরভাবে কাজ করে, যদি আপনার প্রয়োজন হয় |যে ক্ষেত্রে এটি কাজ করে না except
ম্যাট ভুকোমানোভিচ

6
@ ম্যাটভুকোমানোভিচ এটি এখানে বর্ণিত হিসাবে আমার ^|জায়গায় ব্যবহার করে কাজ করে|
এএসটি

commandদয়া করে কোনওভাবেই প্রস্থান কোড ক্যাপচার করা সম্ভব ? আমি নিশ্চিত যে এটি একটি শূন্য-কোড ফিরিয়েছে তবে %ERRORLEVEL%সর্বদা 0 থাকে, যেখানেই আমি এটি ব্যবহার করার চেষ্টা করি না কেন (এমনকি doব্লকের ভিতরেও)। সুতরাং আমি অনুমান করি যে forনির্মাণের কিছু অংশ এটি ওভাররাইট করছে। বিটিডাব্লু এতটা প্রাথমিকের জন্য পাগল দেখাচ্ছে কোডটি কীভাবে প্রয়োজন তা অবিশ্বাস্য।
ডেভিড ফেরেনসি রোগোয়ান

68

আমি এই থ্রেড খুঁজে পেয়েছি যে সেখানে Interweb জিনিস। সারবস্তুটা হচ্ছে:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

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

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

টমের হার্ডওয়ারের সূত্রে ক্রেডিট।


3
কেবল নীচের দিকে যাওয়া (যা অন্যান্য সমস্ত উপায়ে পছন্দনীয়) এর অপূর্ণতা হ'ল এটি মাল্টি-লাইন আউটপুট নিয়ে কাজ করে না।
dgo

তার জন্য আমি অন্য পথে যাব: / f "টোকেন = 2 ডিলিমস = [,]" %% এ ('ভের') সংস্করণ %% একটি প্রতিধ্বনি% সংস্করণ% সেট করে
হার্ডোম্যান

1
আপনি লাইসুচাসেরেবি-
শমুয়েল কামেনস্কি

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

47

একক লাইনে:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

কমান্ড আউটপুট% g এর পরে VAR এ সেট করা হবে AR

আরও তথ্য: https://ss64.com/nt/for_cmd.html


19
আমার ব্যাচটি "% g" দিয়ে চলেনি। এটি "%% g" দিয়ে চলেছিল।
সান্তিয়াগো ভিলাফুয়ের্তে

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

19

একটি ফাইল পড়তে ...

set /P Variable=<File.txt

একটি ফাইল লিখতে

@echo %DataToWrite%>File.txt

বিঃদ্রঃ; <> চরিত্রের আগে ফাঁকা থাকার কারণে ভেরিয়েবলের শেষেও একটি স্থান যুক্ত করা যায়

কোনও লগার প্রোগ্রামের মতো কোনও ফাইল যুক্ত করতে প্রথমে এতে একটি সিঙ্গল এন্টার কী দিয়ে একটি ফাইল তৈরি করুন যার নাম e.txt

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

আপনার লগ এই মত দেখতে হবে

Entry1
Entry2 

ইত্যাদি

যাইহোক একটি দম্পতি দরকারী জিনিস


আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। বিটিডাব্লু "সেট / পি পরিবর্তনশীল = <ফাইল.টেক্সট" কেবল ফাইলের প্রথম লাইনটি পড়ে
ডিপস্কর্ন

19

এই উত্তরগুলি আমার প্রয়োজনীয় উত্তরগুলির এত কাছে ছিল। এটি তাদের উপর প্রসারিত করার চেষ্টা।

একটি ব্যাচের ফাইলে

যদি আপনি কোনও .batফাইলের মধ্যে থেকে চলমান থাকেন এবং আপনি এমন একটি একক লাইন চান যা jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonআপনাকে একটি পরিবর্তনশীল নামের মতো একটি জটিল কমান্ড রফতানি করতে দেয় AWS_ACCESS_KEYতবে আপনি এটি চান:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

কমান্ড লাইনে

আপনি যদি C:\প্রম্পটে থাকেন তবে আপনি একটি একক লাইন চান যা jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonআপনাকে একটি পরিবর্তনশীল নামের মতো একটি জটিল কমান্ড চালাতে দেয় AWS_ACCESS_KEYতবে আপনি এটি চান:

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

ব্যাখ্যা

উপরের দুটি উত্তরের মধ্যে একমাত্র পার্থক্য হ'ল কমান্ড লাইনে, আপনি আপনার ভেরিয়েবলে একক% ব্যবহার করেন। একটি ব্যাচ ফাইলে, আপনাকে শতাংশের চিহ্নগুলি (%%) দ্বিগুণ করতে হবে।

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


13

আপনি যদি কোনও অস্থায়ী ফাইলে আউটপুট নিতে না চান এবং তারপরে কোনও ভেরিয়েবলটিতে পড়তে চান, এই কোডটি কমান্ডের ফলাফলকে সরাসরি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করে:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

আপনি যদি ডাবল উদ্ধৃতিতে অনুসন্ধানের স্ট্রিংটি বন্ধ করতে চান:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

আপনি যদি এই কোডটি ব্যাচ ফাইলে সংরক্ষণ করতে চান তবে একটি অতিরিক্ত% চিহ্ন যোগ করুন:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

কোনও ভেরিয়েবলের ডিরেক্টরিতে এবং ডিরেক্টরিতে ফাইল সংখ্যা গণনা করার জন্য একটি দরকারী উদাহরণ: (পাইপিং চিত্রিত করে)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

উল্লেখ্য উদ্ধৃতি চিহ্ন "বা গ্রেভ অ্যাকসেন্ট` কমান্ড বন্ধনী পরিবর্তে একক উদ্ধৃতি ব্যবহার। এই জন্য ক্লিনার বিকল্প নেই delims, tokensবা usebackqমধ্যে forলুপ।

উইন 10 সিএমডি পরীক্ষিত।


1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause

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

-3

আমি এটির মতো এটি পরীক্ষা করেছি এবং এটি কাজ করেছে:

SET /P Var= | Cmd

কমান্ডটি একটি ভেরিয়েবলের মধ্যে পাইপ দিয়ে, প্রম্পট কমান্ডের ফলাফলটি Cmdভেরিয়েবল " Var" এর মধ্যে .োকাবে ।

হালনাগাদ:

এটি কাজ করে না, আমার খারাপ, স্ক্রিপ্টটি আমি করেছি এটি ছিল:

SET /P Var= | dir /b *.txt
echo %Var%

এটি আসলে দেখা যাক " test.txt" বলি , কিন্তু এটি আসলে dir /b *.txtআদেশের নয় " " আদেশের ফলাফল দেখাচ্ছে echo %var%। উভয় ফলাফল একই ছিল বলে আমি বিভ্রান্ত হয়ে পড়েছিলাম।


3
যদি আপনি ইচ্ছা করে থাকেন pipe the command into a variable promptতবে dir /b *.txt | SET /P Var=আপনার পাইপের দিকটি সঠিক হওয়ার জন্য আপনার এটি লেখা উচিত ছিল । PS: এটি যেভাবে কাজ করে না!
জেসি

-18

এই সাহায্য আশা করি

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
না, এটি প্রশ্নের উত্তর দেয় না question প্রশ্নটি একটি কমান্ডের আউটপুটটিকে একটি ভেরিয়েবলের মধ্যে পেতে চলেছে
jeb

সহজ উপায় হ'ল কোনও ফাইলকে লিখতে এবং সেই ফাইলটি থেকে এটি পড়া। "টেস্ট" টেস্ট.টেক্সট> টেস্টআউটপুট.টেক্সট সেট /pa=<testoutput.txt প্রতিধ্বনি% a%
Ben2014
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.