উইন্ডোজ কমান্ড লাইনে ব্যাচ ফাইলগুলিতে পরামিতি ব্যবহার করা


161

উইন্ডোতে, কোনও ব্যাচ ফাইল চালানো হলে আপনি কীভাবে যুক্তিগুলি অ্যাক্সেস করবেন?

উদাহরণস্বরূপ, ধরা যাক আমার নামক একটি প্রোগ্রাম রয়েছে hello.bat। যখন আমি hello -aএকটি উইন্ডোজ কমান্ড লাইনে প্রবেশ করি, তখন আমি কীভাবে আমার প্রোগ্রামটিকে জানাতে পারি যে -aএটি একটি আর্গুমেন্ট হিসাবে পাস হয়েছিল?


: কিভাবে একটি ব্যাচ ফাইলে কমান্ড লাইন প্যারামিটার পাস stackoverflow.com/questions/26551/...
এরিক Leschinski

3
তিনি "ডস কমান্ড লাইন" উল্লেখ করেছেন।
ডেভিড আর ট্রিবিলে

উত্তর:


287

অন্যরা যেমন ইতিমধ্যে বলেছে, কমান্ড লাইনের মধ্য দিয়ে পাস করা প্যারামিটারগুলি %1চিহ্নিতকরণ সহ ব্যাচ ফাইলে অ্যাক্সেস করা যায় %9। আরও দুটি টোকেন রয়েছে যা আপনি ব্যবহার করতে পারেন:

  • %0হয় এক্সিকিউটেবল (ব্যাচ ফাইল) নাম কমান্ড লাইনে উল্লিখিত
  • %*হয় সকল প্যারামিটার কমান্ড লাইনে উল্লিখিত - এই খুব দরকারী আপনি অন্য প্রোগ্রাম পরামিতি ফরোয়ার্ড করতে চান।

পরামিতিগুলি কীভাবে অ্যাক্সেস করা যায় তা ছাড়াও সচেতন হওয়ার জন্য প্রচুর গুরুত্বপূর্ণ কৌশল রয়েছে।

একটি প্যারামিটার পাস হয়েছে কিনা তা পরীক্ষা করা হচ্ছে

এটি যেমন কনস্ট্রাক্ট দিয়ে সম্পন্ন হয় IF "%~1"=="", এটি সত্য এবং যদি শুধুমাত্র কোনও আর্গুমেন্ট পাস না করা হয়। টিল্ড চরিত্রটি নোট করুন যার ফলে কোনও আশেপাশের উদ্ধৃতিগুলির মান থেকে মুছে ফেলা হয় %1; টিলড ছাড়াই আপনি অপ্রত্যাশিত ফলাফল পাবেন যদি সেই মানটিতে সিনট্যাক্স ত্রুটির সম্ভাবনা সহ ডাবল কোটস অন্তর্ভুক্ত থাকে।

9 টিরও বেশি যুক্তি হ্যান্ডেল করা (বা কেবল জীবনকে সহজ করে তোলা)

আপনার যদি 9 টিরও বেশি আর্গুমেন্ট অ্যাক্সেস করার প্রয়োজন হয় তবে আপনাকে কমান্ডটি ব্যবহার করতে হবে SHIFT। এই কমান্ডের বদল আনতে এক জায়গায় সব আর্গুমেন্ট মূল্যবোধ, যাতে %0এর মান লাগে %1, %1এর মান লাগে %2, ইত্যাদি %9দশম যুক্তি মান কল করার আগে কোনো পরিবর্তনশীল মাধ্যমে (যদি এক ভাবে উপস্থিত) লাগে, যা উপলব্ধ ছিল না SHIFT(Enter SHIFT /?আরও বিকল্পের জন্য কমান্ড )।

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

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

এই স্কিম আপনাকে পাগল না হয়ে বেশ জটিল কমান্ড লাইনগুলি পার্স করতে দেয়।

ব্যাচের পরামিতিগুলির প্রতিস্থাপন

ফাইলগুলির নাম উপস্থাপন করে এমন পরামিতিগুলির জন্য শেল ফাইলগুলির সাথে কাজ করার জন্য প্রচুর কার্যকারিতা সরবরাহ করে যা অন্য কোনও উপায়ে অ্যাক্সেসযোগ্য নয়। এই কার্যকারিতাটি কনস্ট্রাক্ট দিয়ে শুরু হয় যা শুরু হয় %~

উদাহরণস্বরূপ, ফাইলের আকারটি আর্গুমেন্ট ব্যবহার হিসাবে পাস করার জন্য

ECHO %~z1

যে ব্যাচের ফাইলটি চালু হয়েছিল (যেখানে খুব কার্যকর!) আপনি ব্যবহার করতে পারেন সেই ডিরেক্টরিটির পাথ পেতে

ECHO %~dp0

CALL /?কমান্ড প্রম্পটে টাইপ করে আপনি এই ক্ষমতাগুলির সম্পূর্ণ পরিসর দেখতে পারেন ।


4
দ্য পার্স,: এন্ড পার্স কন্সট্রাক্ট হ'ল বিউটি, এমনকি গোটোর সাথেও। ধন্যবাদ! (মানে ডস-বেসিক জোর করে
জোটো

1
পাওয়ারশেল থেকে বিএটি কল করার সময় এই কৌশলটি ব্যর্থ হতে পারে। একটি উদ্ধৃত যুক্তি যেমন এক্সের সময় "name=John"হয়ে যাবে name John। একটি কার্যবিবরণী একক উদ্ধৃতি দিয়ে ঘিরে থাকবে,'"name=John"'
সেমিচিন্টি

1
এত দিন না করে কেমন করে চলে গেলাম CALL /?!? এখানে আমি পুরো সময় গুগলের সাথে ঘুরে বেড়াচ্ছি।
bigtlb

@ জোন আমি ব্যাট ফাইলটি লিখেছি যার মধ্যে কেবলমাত্র একটি কোড প্রতিধ্বনিত% 1 থাকে যদি আমি সেটিকে সিএমডি এর মাধ্যমে কল করি তবে xx.bat & পরামিতি> "সি: y yy.txt" ব্যাটার ফাইলটিকে প্যারামিটার দিয়ে কল করে txt ফাইলে লিখছি তবে যদি আমি & শুরুতে বা প্যারামিটারে এটি কাজ করছে না। অন্য যে কোনও পাঠ্য সূক্ষ্মভাবে কাজ করছে।
অ্যালেক্স ম্যাথিউ

56

ব্যাচ ফাইলে প্যারামিটার ব্যবহার করে:% 0 এবং% 9

ব্যাচ ফাইলগুলি টোকেন: %0টু দিয়ে পরামিতি হিসাবে পাস হওয়া শব্দের উল্লেখ করতে পারে %9

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

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

উদাহরণ:

নামে পরিচিত একটি ব্যাচ ফাইলে নিম্নলিখিত কমান্ডটি রাখুন mybatch.bat:

@echo off
@echo hello %1 %2
pause

ব্যাচ ফাইলটি এভাবে চালানো: mybatch john billyআউটপুট হবে:

hello john billy

ব্যাচ ফাইলের জন্য 9 টির বেশি পরামিতি পান, ব্যবহার করুন:% *

পার্সেন্ট স্টার টোকেনের %*অর্থ "বাকি পরামিতিগুলি"। এখানে সংজ্ঞায়িত হিসাবে আপনি এগুলি ধরতে লুপের জন্য একটি ব্যবহার করতে পারেন:

http://www.robvanderwoude.com/parameters.php

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

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

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored

5

ব্যাচের ফাইলগুলি প্রোগ্রামের পরে স্বয়ংক্রিয়ভাবে পাঠ্যটি এতো দিন দেয় যতক্ষণ না তাদের ভেরিয়েবলগুলি এনে দেওয়া হয়। তারা প্রেরণ করা হয় যাতে তারা প্রেরণ করা হয়; উদাহরণস্বরূপ% 1 প্রোগ্রামটি বলার পরে প্রেরণ করা প্রথম স্ট্রিং ইত্যাদি হবে etc.

আপনার যদি হ্যালো.ব্যাট থাকে এবং সামগ্রীগুলি হ'ল:

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

এবং আপনি মাধ্যমে কমান্ড আদেশ কমান্ড

হ্যালো.বাট এপারসন 241% তারিখ

আপনার এই বার্তাটি ফিরে পাওয়া উচিত:

হ্যালো, এপারসন 241 এই ব্যাচ ফাইলটি চালানোর জন্য ধন্যবাদ (01/11/2013)


4

@ জোনস :parse/ :endparseস্কিম একটি দুর্দান্ত শুরু, এবং প্রাথমিক পাসের জন্য তার প্রতি আমার কৃতজ্ঞতা আছে, তবে আপনি যদি মনে করেন যে উইন্ডোজ জালিয়াতি ব্যাচ সিস্টেমটি আপনাকে এত সহজ করে দেবে ... ভাল, বন্ধু, আপনি একটি ধাক্কার জন্য আছেন। আমি এই শয়তানটির সাথে পুরো দিনটি কাটিয়েছি এবং অনেক বেদনাদায়ক গবেষণা এবং পরীক্ষার পরে অবশেষে আমি বাস্তব-জীবন উপযোগের জন্য কার্যকর কিছু পরিচালনা করেছি।

আমাদের বলুন যে আমরা একটি ইউটিলিটি বাস্তবায়ন করতে চাই foobar। এটির জন্য প্রাথমিক কমান্ডের প্রয়োজন। এটিতে একটি alচ্ছিক প্যারামিটার রয়েছে --fooযা একটি alচ্ছিক মান গ্রহণ করে (যা অবশ্যই অন্য কোনও প্যারামিটার হতে পারে না); মানটি যদি এটি অনুপস্থিত থাকে তবে এটি ডিফল্ট হয় default। এটিতে একটি alচ্ছিক পরামিতি রয়েছে --barযা প্রয়োজনীয় মান গ্রহণ করে। শেষ পর্যন্ত এটি --bazকোনও মূল্য ছাড়াই পতাকা গ্রহণ করতে পারে । ওহ, এবং এই পরামিতিগুলি যে কোনও ক্রমে আসতে পারে।

অন্য কথায়, এটি দেখতে এটির মতো দেখাচ্ছে:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

জটিল? না, বাস্তব জীবনের ইউটিলিটিগুলির কাছে এটি বেশ সাধারণ বলে মনে হচ্ছে। ( gitকেউ?)

আরও অগ্রগতি ব্যতীত, এখানে একটি সমাধান:

@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson

SET CMD=%~1

IF "%CMD%" == "" (
  GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=

SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
  SHIFT
  IF NOT "%ARG%" == "" (
    IF NOT "%ARG:~0,2%" == "--" (
      SET FOO=%ARG%
      SHIFT
    ) ELSE (
      SET FOO=%DEFAULT_FOO%
    )
  ) ELSE (
    SET FOO=%DEFAULT_FOO%
  )
) ELSE IF "%PARAM%" == "--bar" (
  SHIFT
  IF NOT "%ARG%" == "" (
    SET BAR=%ARG%
    SHIFT
  ) ELSE (
    ECHO Missing bar value. 1>&2
    ECHO:
    GOTO usage
  )
) ELSE IF "%PARAM%" == "--baz" (
  SHIFT
  SET BAZ=true
) ELSE IF "%PARAM%" == "" (
  GOTO endargs
) ELSE (
  ECHO Unrecognized option %1. 1>&2
  ECHO:
  GOTO usage
)
GOTO args
:endargs

ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
  ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
  ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
  ECHO Baz
)

REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof

:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1

হ্যাঁ, এটি আসলেই খারাপ। আমার অনুরূপ পোস্টটি https://stackoverflow.com/a/50653047/421049 এ দেখুন , যেখানে আমি যুক্তিতে কী চলছে এবং কেন আমি নির্দিষ্ট কিছু নির্মাণ ব্যবহার করেছি তার আরও বিশ্লেষণ সরবরাহ করি।

অসহ্য। তার বেশিরভাগটি আমাকে আজ শিখতে হয়েছিল। এবং এটি আঘাত।


3

ভেরিয়েবল ব্যবহার করুন অর্থাৎ .BATভেরিয়েবল এবং ডাকা %0হয়%9

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