ব্যাচ ফাইলের মধ্যে ভেরিয়েবলের জন্য বাহ্যিক ফাইল অন্তর্ভুক্ত থাকে


98

আমার একটি ব্যাচ ফাইল রয়েছে এবং আমি কিছু ভেরিয়েবল (বাহ্য কনফিগারেশন ভেরিয়েবল) যুক্ত বহিরাগত ফাইল অন্তর্ভুক্ত করতে চাই। এটা কি সম্ভব?


উত্তর:


132

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

এক্সিকিউটেবল কনফিগারেশন

এটি করার সহজতম উপায় হ'ল কেবল একটি ব্যাচের ফাইলগুলিতে ভেরিয়েবলগুলি নিজেরাই রাখা, প্রত্যেকটির নিজস্ব setবিবৃতি সহ:

set var1=value1
set var2=value2
...

এবং আপনার প্রধান ব্যাচে:

call config.cmd

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

কী / মান জোড়া

আর একটি উপায় var=valueকনফিগারেশন ফাইলের মধ্যে এক ধরণের জোড়া হবে:

var1=value1
var2=value2
...

তারপরে আপনি সেগুলি লোড করার জন্য নিম্নলিখিত স্নিপেট ব্যবহার করতে পারেন:

for /f "delims=" %%x in (config.txt) do (set "%%x")

এটি আগের মতো একই কৌশল ব্যবহার setকরে , কেবল প্রতিটি লাইনে ব্যবহার করে। কোট ভালো জিনিস অব্যাহতি আছে <, >, &, |। যাইহোক, ইনপুট-এ কোট ব্যবহার করা হলে এগুলি নিজেরাই ভেঙে দেবে। এছাড়াও এই জাতীয় অক্ষরগুলির সাথে সঞ্চিত ভেরিয়েবলগুলিতে আরও ডেটা প্রক্রিয়াকরণ করার সময় আপনার সর্বদা সতর্ক হওয়া উচিত।

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


এটি আমার পক্ষে কাজ করে না, আপনি কি দয়া করে তা পরীক্ষা করতে পারেন: stackoverflow.com/questions/46147450/…
নাগুইব ইহাব

35

যদি বাহ্যিক কনফিগারেশন ফাইলটি বৈধ ব্যাচ ফাইলও হয় তবে আপনি কেবল ব্যবহার করতে পারেন:

call externalconfig.bat

আপনার স্ক্রিপ্ট ভিতরে। A.bat অনুসরণ করার চেষ্টা করুন:

@echo off
call b.bat
echo %MYVAR%

এবং বি.বাট:

set MYVAR=test

এ.বাট চালিয়ে আউটপুট উত্পন্ন করা উচিত:

test

এটি আমার পক্ষে কাজ করে না, আপনি কি দয়া করে তা পরীক্ষা করতে পারেন: stackoverflow.com/questions/46147450/…
নাগুইব ইহাব

যদি অন্য স্ক্রিপ্টে কনফিগার ফাইলটি সমান্তরালে ব্যবহার করা হয় (এটির সাথে কল করা call, যা বিটিডব্লু সিঙ্ক্রোনাস হয়), এটি বলে যে "প্রক্রিয়াটি যে ফাইলটি ব্যবহৃত হচ্ছে তা অ্যাক্সেস করতে পারে না" এবং আহ্বান করা যাবে না।
domih

2

ব্যাচটি ইনপুট এবং আউটপুট পাইপ হিসাবে বন্ধনীগুলির চেয়ে কম এবং বেশি ব্যবহার করে।

>file.ext

উপরের মতো কেবলমাত্র একটি আউটপুট বন্ধনী ব্যবহার করা সেই ফাইলের সমস্ত তথ্য ওভাররাইট করে।

>>file.ext

ডাবল ডান বন্ধনী ব্যবহার করে ফাইলের পরবর্তী পংক্তিটি যুক্ত হবে।

(
echo
echo
)<file.ext

এটি ফাইলের লাইনের ভিত্তিতে পরামিতিগুলি কার্যকর করবে ute এই ক্ষেত্রে, আমরা দুটি লাইন ব্যবহার করছি যা "প্রতিধ্বনি" ব্যবহার করে টাইপ করা হবে। বাম বন্ধনী ডান বন্ধনী বন্ধনী স্পর্শ করার অর্থ এই ফাইলটি থেকে প্রাপ্ত তথ্যগুলি সেই লাইনগুলিতে পাইপ করা হবে।

আমি কেবল-পঠন / লেখার ফাইলের উদাহরণটি সংকলন করেছি। প্রতিটি অংশ কী করে তা ব্যাখ্যা করার জন্য নীচে ফাইলটি বিভাগে বিভক্ত করা হয়েছে।

@echo off
echo TEST R/W
set SRU=0

এসআরইউ এই উদাহরণে কিছু হতে পারে। আপনি যদি খুব দ্রুত এন্টার টিপেন তবে আমরা ক্র্যাশ প্রতিরোধের জন্য এটি সেট করছি setting

set /p SRU=Skip Save? (y): 
if %SRU%==y goto read
set input=1
set input2=2
set /p input=INPUT: 
set /p input2=INPUT2: 

এখন, আমাদের একটি ফাইলের ভেরিয়েবলগুলি লিখতে হবে।

(echo %input%)> settings.cdb
(echo %input2%)>> settings.cdb
pause

আমি "কমান্ড ডেটাবেস" এর সংক্ষিপ্ত ফর্ম হিসাবে .cdb ব্যবহার করি। আপনি যে কোনও এক্সটেনশন ব্যবহার করতে পারেন। পরের অংশটি কোডটি স্ক্র্যাচ থেকে পরীক্ষা করা। আমরা ফাইলের শুরুতে চালিত সেট ভেরিয়েবলগুলি ব্যবহার করতে চাই না, আমরা আসলে চাইছি সেগুলি সেটিংসের মাধ্যমে লোড করা হোক .c সিডিবি আমরা সবে লিখেছি।

:read
(
set /p input=
set /p input2=
)<settings.cdb

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

echo %input%
echo %input2%
pause
if %input%==1 goto newecho
pause
exit

:newecho
echo If you can see this, good job!
pause
exit

সেটিংস। সিডিবি বন্ধনীতে পাইপ করার সময় সেট করা তথ্যটি এটি প্রদর্শন করে। অতিরিক্ত ভাল-কাজের অনুপ্রেরণাকারী হিসাবে, এন্টার টিপুন এবং "1" হিসাবে আমরা পূর্বনির্ধারিত ডিফল্ট মানগুলি সেট করে দিলে একটি ভাল কাজের বার্তা ফিরে আসবে। ব্র্যাকেট পাইপ ব্যবহার করা উভয় পথেই যায় এবং "ফর" স্টাফ সেট করার চেয়ে অনেক সহজ। :)


1

সুতরাং আপনি ঠিক এই কাজ করতে হবে ?:

@echo off
echo text shizzle
echo.
echo pause^>nul (press enter)
pause>nul

REM writing to file
(
echo XD
echo LOL
)>settings.cdb
cls

REM setting the variables out of the file
(
set /p input=
set /p input2=
)<settings.cdb
cls

REM echo'ing the variables
echo variables:
echo %input%
echo %input2%
pause>nul

if %input%==XD goto newecho
DEL settings.cdb
exit

:newecho
cls
echo If you can see this, good job!
DEL settings.cdb
pause>nul
exit

0
:: savevars.bat
:: Use $ to prefix any important variable to save it for future runs.

@ECHO OFF
SETLOCAL

REM Load variables
IF EXIST config.txt FOR /F "delims=" %%A IN (config.txt) DO SET "%%A"

REM Change variables
IF NOT DEFINED $RunCount (
    SET $RunCount=1
) ELSE SET /A $RunCount+=1

REM Display variables
SET $

REM Save variables
SET $>config.txt

ENDLOCAL
PAUSE
EXIT /B

আউটপুট:

$ রানকাউন্ট = 1

$ রানকাউন্ট = 2

$ রানকাউন্ট = 3

উপরে বর্ণিত প্রযুক্তিটি একাধিক ব্যাচের ফাইলগুলির মধ্যে ভেরিয়েবলগুলি ভাগ করতেও ব্যবহার করা যেতে পারে।

সূত্র: http : //www.incodes systemms.com/products/batchfi1.htm


0

কিন্ডা পুরানো বিষয় কিন্তু কিছুদিন আগে আমারও একই প্রশ্ন ছিল এবং আমি আবার একটি ধারণা নিয়ে এসেছি (সম্ভবত এখনও কেউ এটিকে কাজে লাগবে)

উদাহরণস্বরূপ আপনি বিভিন্ন বিষয় (পরিবার, আকার, রঙ, প্রাণী) দিয়ে একটি কনফিগারেট তৈরি করতে পারেন এবং আপনার ব্যাচের স্ক্রিপ্টগুলিতে আপনি যে কোনও স্থানে যে কোনও ক্রমে পৃথকভাবে প্রয়োগ করতে পারেন:

@echo off
rem Empty the variable to be ready for label config_all
set config_all_selected=

rem Go to the label with the parameter you selected
goto :config_%1

REM This next line is just to go to end of file 
REM in case that the parameter %1 is not set
goto :end

REM next label is to jump here and get all variables to be set
:config_all
set config_all_selected=1


:config_family
set mother=Mary
set father=John
set sister=Anna
rem This next line is to skip going to end if config_all label was selected as parameter
if not "%config_all_selected%"=="1" goto :end

:config_test
set "test_parameter_all=2nd set: The 'all' parameter WAS used before this echo"
if not "%config_all_selected%"=="1" goto :end

:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end


:config_color
set first_color=blue
set second_color=green
if not "%config_all_selected%"=="1" goto :end


:config_animals
set dog=Max
set cat=Miau
if not "%config_all_selected%"=="1" goto :end


:end

এরপরে, আপনি 'কল কনফিগারেশন ব্যাট'-এর সাথে পুরোপুরি কল করে বা এর কেবলমাত্র অংশগুলি কল করে এটি যে কোনও জায়গায় ব্যবহার করতে পারবেন (উদাহরণস্বরূপ নমুনা দেখুন) এখানে ধারণাটি হ'ল যখন আপনার কাছে সমস্ত কিছু কল না করার বিকল্প থাকে তখন কখনও কখনও আরও কার্যকর হয় here একদা. কিছু ভেরিয়েবল সম্ভবত আপনাকে এখনও কল করতে চান না যাতে আপনি পরে তাদের কল করতে পারেন।

উদাহরণ test.bat

@echo off

rem This is added just to test the all parameter
set "test_parameter_all=1st set: The 'all' parameter was NOT used before this echo"

call config.bat size

echo My birthday present had a width of %width% and a height of %height%

call config.bat family
call config.bat animals

echo Yesterday %father% and %mother% surprised %sister% with a cat named %cat%
echo Her brother wanted the dog %dog%

rem This shows you if the 'all' parameter was or not used (just for testing)
echo %test_parameter_all%

call config.bat color

echo His lucky color is %first_color% even if %second_color% is also nice.

echo.
pause

আশা করি এটির উত্তরগুলি এখানে অন্যদের যেভাবে আমাকে সহায়তা করে।

উপরের একটি সংক্ষিপ্ত সংস্করণ:

config.bat

@echo off
set config_all_selected=
goto :config_%1
goto :end

:config_all
set config_all_selected=1

:config_family
set mother=Mary
set father=John
set daughter=Anna
if not "%config_all_selected%"=="1" goto :end

:config_size
set width=20
set height=40
if not "%config_all_selected%"=="1" goto :end

:end

test.bat

@echo off

call config.bat size
echo My birthday present had a width of %width% and a height of %height%

call config.bat family
echo %father% and %mother% have a daughter named %daughter%

echo.
pause

শুভ দিন.


-2

আসুন ভাল পুরানো পরামিতি ভুলবেন না। আপনার * .bat বা * .Cmd ফাইল শুরু করার সময় আপনি কমান্ড ফাইলের নামের পরে নয়টি পরামিতি যুক্ত করতে পারেন:

call myscript.bat \\path\to\my\file.ext type
call myscript.bat \\path\to\my\file.ext "Del /F"

উদাহরণ স্ক্রিপ্ট

Myscript.bat এইরকম কিছু হতে পারে:

@Echo Off
Echo The path of this scriptfile %~0
Echo The name of this scriptfile %~n0
Echo The extension of this scriptfile %~x0
Echo.
If "%~2"=="" (
   Echo Parameter missing, quitting.
   GoTo :EOF
)
If Not Exist "%~1" (
   Echo File does not exist, quitting.
   GoTo :EOF
)
Echo Going to %~2 this file: %~1
%~2 "%~1"
If %errorlevel%  NEQ 0 (
   Echo Failed to %~2 the %~1.
)
@Echo On

উদাহরণ আউটপুট

c:\>c:\bats\myscript.bat \\server\path\x.txt type
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat

Going to type this file: \\server\path\x.txt
This is the content of the file:
Some alphabets: ABCDEFG abcdefg
Some numbers: 1234567890

c:\>c:\bats\myscript.bat \\server\path\x.txt "del /f "
The path of this scriptfile c:\bats\myscript.bat
The name of this scriptfile myscript
The extension of this scriptfile .bat

Going to del /f  this file: \\server\path\x.txt

c:\>

-3

এক্সকিউটেবল কনফিগারেশন সহ পদ্ধতিটি ব্যবহার করার চেষ্টা করার সময় আমি লক্ষ্য করেছি যে স্ক্রিপ্টের কোথায় কল রয়েছে তার উপর নির্ভর করে এটি কাজ করতে পারে বা নাও কাজ করতে পারে:

কল কনফিগারেশন

আমি জানি এটি কোনও সংবেদন করে না, তবে আমার কাছে এটি একটি সত্য। যখন "কল কনফিগার্ড.এমডি" স্ক্রিপ্টের শীর্ষে অবস্থিত হয়, এটি কাজ করে, তবে স্ক্রিপ্টে আরও যদি এটি থাকে না।

দ্বারা কাজ করে না, আমি বলতে চাইছি ভেরিয়েবল কল কল স্ক্রিপ্ট আন সেট করা হয় না।

খুব খুব আজব !!!!

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