আমি কীভাবে ব্যাচ ফাইলে যুক্তিগুলি পাস করতে পারি?


1164

চালানোর সময় আমার একটি আইডি এবং একটি পাসওয়ার্ড ফাইলের মধ্যে হার্ডকোড না করে চলার সময় পাস করতে হবে।

কমান্ড লাইনের মতো দেখতে এখানে:

test.cmd admin P@55w0rd > test-log.txt

8
"বাকি সমস্ত" জন্য গ্রেট হেগিলের মন্তব্য দেখুন কিভাবে
ম্যাট উইলকি

আমার একটি এনভায়রনমেন্ট স্টার্টআপ স্ক্রিপ্ট রয়েছে যা আমার ইউজার নেম / পাসওয়ার্ডকে পরিবেশের ভেরিয়েবলগুলিতে ঠেলে দেবে ... যাতে আমাকে প্রতিবার এগুলি টাইপ করতে না হয় ... আমি বেশিরভাগ সময় ব্যাশ ব্যবহার করছি যদিও (লিনাক্স, ম্যাক এবং উইন্ডোজ), এবং এটি কাজের জন্য স্ক্রিপ্টগুলিতে প্রক্সি কনফিগারেশনের জন্য ব্যবহার করতে হবে।
ট্র্যাকার 1

উত্তর:


1031

%*"সমস্ত" অর্থ বোঝাতে আরেকটি দরকারী টিপ ব্যবহার করা। উদাহরণ স্বরূপ:

echo off
set arg1=%1
set arg2=%2
shift
shift
fake-command /u %arg1% /p %arg2% %*

আপনি যখন চালান:

test-command admin password foo bar

উপরের ব্যাচ ফাইলটি চলবে:

fake-command /u admin /p password admin password foo bar

আমার সিনট্যাক্সটি কিছুটা ভুল হতে পারে তবে এটি সাধারণ ধারণা।


123
শিফট নির্বিশেষে% * সমস্ত প্যারামিটারে প্রসারিত হয়। সুতরাং দুটি স্থানান্তরের পরেও আপনার এখনও% * তে প্রথম দুটি যুক্তি থাকতে হবে। আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন: প্রথম এন প্যারামিটার ব্যতীত যা কিছু থাকে তার একটি ভেরিয়েবল পেতে stackoverflow.com/questions/761615/…
জোয়

1
দয়া করে নোট করুন যে% * সর্বত্র কাজ করে না! উদাহরণস্বরূপ, এটি ডসবক্স 0.73 এর সাথে কাজ করে না (সম্ভবত এটি একটি বাগ যা রিপোর্ট করা উচিত)।
ডেনিলসন সা মিয়া

28
এটি কোনও ত্রুটি নয় কারণ% * এমএস-ডস বা উইন 9 এক্সে প্রথম স্থানে কাজ করেন নি।
কেফ শেকটার

আমি মনে করি shiftতালিকা থেকে যুক্তিটি "পপ" করে। ওপি-র অনুমানটি ছিল %*কেবলমাত্র বাকী যুক্তিগুলি আউটপুট দেয় তবে @ জোয়ি যেমন বলেছিলেন তেমনভাবে এটি কাজ করে না।
নাথানএলডেনএসআর

5
এই উত্তরটি ভুল। এটি আসলে ফলাফল fake-command /u admin /p password admin password foo bar। এটি অনেক বছর আগে @ জোই দ্বারা চিহ্নিত করা হয়েছিল।
jwdonahue

286

আমি এটি কীভাবে করেছি তা এখানে:

@fake-command /u %1 /p %2

কমান্ডটি কেমন দেখাচ্ছে তা এখানে:

test.cmd admin P@55w0rd > test-log.txt

%1প্রথম প্যারামিটার ক্ষেত্রে প্রযোজ্য %2(এবং এখানে চতুর অংশ) দ্বিতীয় ক্ষেত্রে প্রযোজ্য। আপনি এভাবে 9 টি পরামিতি পাস করতে পারেন।


16
তুমি আমাকে যেমন বোবা যেমন হন, তাহলে আপনার মন খুঁজছিলাম echo %1 %2এবং একটি অ কাটা-এবং-pasteable সহজ ক্ষেত্রে দ্বারা বন্ধ করে দেওয়া হয় @এবং একটি fake-commandপ্যারাম সঙ্গে, চিন্তা আমরা পেতে চাই fake-command.batপরে এর বিষয়বস্তু (যে ক্ষেত্রে, অতিরিক্ত জটিলতার কারণে পরম নামগুলি উপেক্ষা করতে fake-command.batহতে পারে echo %2 %4)। ভুল, ডুফাস টিএল; ডিআর: আমার মতো বোবা হবেন না। 1. echo echo %1 %2 > test.bat2. test word1 word2। 3. লাভ।
রাফিন

143

আপনি যদি অনুপস্থিত প্যারামিটারগুলি বুদ্ধিমানের সাথে পরিচালনা করতে চান তবে আপনি এর মতো কিছু করতে পারেন:

IF %1.==. GOTO No1
IF %2.==. GOTO No2
... do stuff...
GOTO End1

:No1
  ECHO No param 1
GOTO End1
:No2
  ECHO No param 2
GOTO End1

:End1

2
এই সমতা অপারেশনগুলিতে ডট / পিরিয়ডের তাত্পর্য কী?
ক্রিস

4
মূলত% 1 খালি থাকলে, এটি আইএফ হয়ে শেষ হবে। ==। এবং তাই GOTO ঘটবে। আমরা এখানে x ব্যবহার করি: IF x% 1 == x -> IF x == x -> সত্য
কার্ল

1
"অপ্রতিরোধ্য যুক্তি" এর মূল্যটি কী? আপনার "অপ্রতিরোধ্য যুক্তি" যাচাই করা উচিত তার বিপরীতে? তারপরে, যদি আপনার কোনও উত্তর না থাকে তবে আপনার বিন্দুগুলির মতো একটি কৌশল ব্যবহার করা উচিত। মনে রাখবেন যে এখানে ss64.com/nt/if.html এখানে বর্ণিত আছে "আপনি আসলে এটি ' any ' বা কোঁকড়ানো বন্ধনী, {} বা এমনকি 4 নম্বর এর জন্য প্রায় কোনও অক্ষর ব্যবহার করতে পারেন তবে বর্গাকার বন্ধনীগুলি বেছে নেওয়ার প্রবণতা রয়েছে কারণ তাদের কোন বিশেষ অর্থ নেই। "
এড্রিয়ানো জিভি এস্পোসিতো

89

ব্যাচ প্যারামিটার অ্যাক্সেস করা% 1,% 2, ...% 9 বা এছাড়াও% * দিয়ে সহজ হতে পারে
তবে কেবল সামগ্রীটি সহজ হলেই if

জটিল বিষয়বস্তুর মতো সহজ উপায় নেই "&"^&, কারণ ত্রুটি তৈরি না করে% 1 এ অ্যাক্সেস করা সম্ভব নয়।

set  var=%1
set "var=%1"
set  var=%~1
set "var=%~1"

লাইনগুলি প্রসারিত হয়

set  var="&"&
set "var="&"&"
set  var="&"&
set "var="&"&"

এবং প্রতিটি লাইন ব্যর্থ হয়, যেহেতু এর একটি এর &কোটের বাইরের।

এটি কোনও অস্থায়ী ফাইল থেকে প্যারামিটারের একটি রেকর্ড করা সংস্করণ থেকে পড়ার মাধ্যমে সমাধান করা যেতে পারে ।

@echo off
SETLOCAL DisableDelayedExpansion

SETLOCAL
for %%a in (1) do (
    set "prompt="
    echo on
    for %%b in (1) do rem * #%1#
    @echo off
) > param.txt
ENDLOCAL

for /F "delims=" %%L in (param.txt) do (
  set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'

কৌশলটি হ'ল echo onএকটি remবিবৃতি দেওয়ার পরে% 1 সক্ষম এবং প্রসারিত করা (এটিও কাজ করে %2 .. %*)।
এমনকি "&"&এটি কোনও ত্রুটি তৈরি না করেই প্রতিধ্বনিত হতে পারে, যেমনটি মন্তব্য করা হয়।

তবে এর আউটপুট পুনর্নির্দেশ করতে সক্ষম হতে echo onআপনার দুটি ফুপ লুপের প্রয়োজন।

অতিরিক্ত অক্ষরগুলি ( * #যেমন সহায়তাটি প্রদর্শিত /?হবে REM) এর মতো সামগ্রীর বিরুদ্ধে নিরাপদ থাকতে ব্যবহৃত হয় ।
বা লাইনের শেষে একটি ক্যারেট একের পরেও একাধিক লাইন চরিত্র হিসাবে কাজ করতে পারে rem

তারপরে ফাইলটি থেকে রিম প্যারামিটার আউটপুট পড়ছেন তবে সাবধানতার সাথে।
ফর / এফটি বিলম্বিত সম্প্রসারণ বন্ধ করে কাজ করা উচিত, অন্যথায় সামগ্রী "!" ধ্বংস করা হবে।
অতিরিক্ত অক্ষরগুলি মুছে ফেলার পরে param1, আপনি এটি পেয়েছেন।

এবং param1নিরাপদ উপায়ে ব্যবহার করতে, বিলম্বিত প্রসারণ সক্ষম করুন।


/ এফ "টোকেনস = *" %% এ ইন ('প্রতিধ্বনি% *') সেট করুন "all_args = %% a"
কেভিন এডওয়ার্ডস

@ কেভিন এডওয়ার্ডস এর পরে এটি দিয়ে চেষ্টা করুন &, আপনার সমাধানটি কেবল সাধারণ বিষয়বস্তু নিয়ে কাজ করে
jeb

@ কেভিনিএডওয়ার্ডস আমি এটি পরীক্ষা করেছি test.bat ^&এবং এটি ব্যর্থ হয়েছে। কেবল test.bat "&"কাজ করে, তবে এটি আমার বক্তব্য ছিল না। আপনি ব্যবহার করতে পারবেন না %*, %1REM কলাকৌশল ছাড়া একটি নিরাপদ ভাবে
Jeb

আহ, হ্যাঁ, একটি ক্যারেট এটিকে সঠিকভাবে এড়ায় না। আপনার উদ্ধৃতি দরকার, যা আমি ব্যবহার করে এসেছি এমন সমস্ত ব্যবহারের ক্ষেত্রে সম্ভব। আমি শুধু এটি বরাবর পাস করতে চেয়েছিলেন। এটি পরীক্ষার জন্য ধন্যবাদ! চিয়ার্স :)
কেভিন এডওয়ার্ডস

2
@jwdonahue হ্যাঁ, এটি জটিল (তবে জটিল নয়)। তবে বিশেষত পাসওয়ার্ডগুলির জন্য এটি প্রয়োজনীয় হতে পারে, আমার কিছু পাসওয়ার্ডে কমপক্ষে অ্যাম্পারস্যান্ডগুলি &এবং "
কোটসও রয়েছে

59

হাঁ, এবং মাত্র মত বিকল্পগুলি ব্যবহার করতে ভুলবেন না %%1যখন ব্যবহার ifএবং forএবং গ্যাং।

যদি আপনি ডাবলটি ভুলে যান %তবে আপনি (সম্ভবত নাল) কমান্ড লাইন আর্গুমেন্টগুলিতে প্রতিস্থাপন করবেন এবং আপনি কিছু বিভ্রান্তিকর ত্রুটি বার্তা পাবেন।


%% শুধুমাত্র ifএবং এর জন্য for?
রই নমির

25
এটি এর চেয়েও খারাপ - %% ব্যাচ ফাইলগুলির অভ্যন্তরে ভেরিয়েবলগুলি এবং কমান্ড লাইন পরামিতিগুলির উপসর্গ করতে ব্যবহৃত হয় । আপনি যখন কমান্ড লাইন থেকে এই কমান্ডগুলি ব্যবহার করেন, আপনি উপসর্গের জন্য শুধুমাত্র% ব্যবহার করেন। উদাহরণ: ব্যাচের অভ্যন্তর: for %%d in (*) do echo %%dকমান্ড লাইন থেকে:for %d in (*) do echo %d
স্টিভ মিডগলি

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

আমরা সাধারণত কমান্ড লাইন প্রসেসিংয়ের জন্য অঙ্কগুলি সংরক্ষণ করি এবং ডাবল শতাংশ কেবলমাত্র যতদূর জানি বিবৃতি দেওয়ার জন্য প্রযোজ্য। @for %%2 in (testing) do @echo %%2 %1একটি ব্যাচ ফাইলে, testing 1যখন এটি 1 ( test 1) দিয়ে ডাকা হয় তখন উত্পাদন করে ।
jwdonahue

2
উত্তরটি ভুল। %%1কোনও কমান্ড লাইন যুক্তি অ্যাক্সেস করে না এবং এটি IFকমান্ডের জন্যও ভুল । কেবল FORকমান্ডটি (ব্যাচ ফাইলগুলিতে) ডাবল পার্সেন্ট প্রয়োজন, তবে তারপরেও %%1একটি ফর প্যারামিটার সংজ্ঞায়িত করা হয় এবং
তর্কগুলি

51

এটি জটিল করার দরকার নেই। এটি কেবল কমান্ডটি% 1% 2 পরামিতি, উদাহরণস্বরূপ,

@echo off

xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z

echo copied %1 to %2

pause

"বিরতি" ব্যাচ ফাইলটি কী করেছে তা প্রদর্শন করে এবং আপনার যে কোনও কী চাপার জন্য অপেক্ষা করে। এটি উইন্ডোজ ফোল্ডারে xx.bat হিসাবে সংরক্ষণ করুন।

এটি ব্যবহার করতে, টাইপ করুন, উদাহরণস্বরূপ:

xx c:\f\30\*.* f:\sites\30

এই ব্যাচ ফাইলটি সমস্ত প্রয়োজনীয় পরামিতিগুলির যত্ন নেয়, যেমন কেবলমাত্র ফাইলগুলি অনুলিপি করা, ইত্যাদি I আমি উইন্ডোজ এর আগে থেকেই এটি ব্যবহার করেছি। আপনি যদি ফাইলগুলির নামগুলি অনুলিপি করা দেখতে চান তবে Qপ্যারামিটারটি ছেড়ে দিন ।


41

একটি বন্ধু আমাকে সম্প্রতি এই বিষয় সম্পর্কে জিজ্ঞাসা করছিল, তাই আমি ভেবেছিলাম যে আমি কীভাবে ব্যাচ ফাইলগুলিতে কমান্ড-লাইন যুক্তিগুলি পরিচালনা করব handle

আপনি দেখতে পাবেন এই কৌশলটিতে কিছুটা ওভারহেড রয়েছে তবে এটি আমার ব্যাচের ফাইলগুলি বোঝার জন্য খুব সহজ এবং বাস্তবায়িত করার জন্য দ্রুত করে তোলে। পাশাপাশি নিম্নলিখিত কাঠামো সমর্থন:

>template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...]

এটি jist হচ্ছে না :init, :parseএবং :mainফাংশন।

ব্যবহারের উদাহরণ

>template.bat /?
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

USAGE:
test.bat [flags] "required argument" "optional argument"

/?, --help           shows this help
/v, --version        shows the version
/e, --verbose        shows detailed output
-f, --flag value     specifies a named parameter value

>template.bat          <- throws missing argument error
(same as /?, plus..)
****                                   ****
****    MISSING "REQUIRED ARGUMENT"    ****
****                                   ****

>template.bat -v
1.23

>template.bat --version
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

>template.bat -e arg1
**** DEBUG IS ON
UnNamedArgument:    "arg1"
UnNamedOptionalArg: not provided
NamedFlag:          not provided

>template.bat --flag "my flag" arg1 arg2
UnNamedArgument:    "arg1"
UnNamedOptionalArg: "arg2"
NamedFlag:          "my flag"

>template.bat --verbose "argument #1" --flag "my flag" second
**** DEBUG IS ON
UnNamedArgument:    "argument #1"
UnNamedOptionalArg: "second"
NamedFlag:          "my flag"

template.bat

@::!/dos/rocks
@echo off
goto :init

:header
    echo %__NAME% v%__VERSION%
    echo This is a sample batch file template,
    echo providing command-line arguments and flags.
    echo.
    goto :eof

:usage
    echo USAGE:
    echo   %__BAT_NAME% [flags] "required argument" "optional argument" 
    echo.
    echo.  /?, --help           shows this help
    echo.  /v, --version        shows the version
    echo.  /e, --verbose        shows detailed output
    echo.  -f, --flag value     specifies a named parameter value
    goto :eof

:version
    if "%~1"=="full" call :header & goto :eof
    echo %__VERSION%
    goto :eof

:missing_argument
    call :header
    call :usage
    echo.
    echo ****                                   ****
    echo ****    MISSING "REQUIRED ARGUMENT"    ****
    echo ****                                   ****
    echo.
    goto :eof

:init
    set "__NAME=%~n0"
    set "__VERSION=1.23"
    set "__YEAR=2017"

    set "__BAT_FILE=%~0"
    set "__BAT_PATH=%~dp0"
    set "__BAT_NAME=%~nx0"

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedOptionalArg="
    set "NamedFlag="

:parse
    if "%~1"=="" goto :validate

    if /i "%~1"=="/?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="-?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="--help"     call :header & call :usage "%~2" & goto :end

    if /i "%~1"=="/v"         call :version      & goto :end
    if /i "%~1"=="-v"         call :version      & goto :end
    if /i "%~1"=="--version"  call :version full & goto :end

    if /i "%~1"=="/e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="-e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="--verbose"  set "OptVerbose=yes"  & shift & goto :parse

    if /i "%~1"=="--flag"     set "NamedFlag=%~2"   & shift & shift & goto :parse

    if not defined UnNamedArgument     set "UnNamedArgument=%~1"     & shift & goto :parse
    if not defined UnNamedOptionalArg  set "UnNamedOptionalArg=%~1"  & shift & goto :parse

    shift
    goto :parse

:validate
    if not defined UnNamedArgument call :missing_argument & goto :end

:main
    if defined OptVerbose (
        echo **** DEBUG IS ON
    )

    echo UnNamedArgument:    "%UnNamedArgument%"

    if defined UnNamedOptionalArg      echo UnNamedOptionalArg: "%UnNamedOptionalArg%"
    if not defined UnNamedOptionalArg  echo UnNamedOptionalArg: not provided

    if defined NamedFlag               echo NamedFlag:          "%NamedFlag%"
    if not defined NamedFlag           echo NamedFlag:          not provided

:end
    call :cleanup
    exit /B

:cleanup
    REM The cleanup function is only really necessary if you
    REM are _not_ using SETLOCAL.
    set "__NAME="
    set "__VERSION="
    set "__YEAR="

    set "__BAT_FILE="
    set "__BAT_PATH="
    set "__BAT_NAME="

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedArgument2="
    set "NamedFlag="

    goto :eof

32
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

দ্রষ্টব্য: যদি উদ্ধৃতি নিজেই আবদ্ধ "%1"==""থাকে তবে আইএফ সমস্যা সৃষ্টি করবে %1

যে ক্ষেত্রে, ব্যবহার ইন IF [%1]==[]বা, NT তে 4 (SP6) এ এবং পরে শুধুমাত্র IF "%~1"==""পরিবর্তে।


যথেষ্ট সত্য, তবে এটি সবেমাত্র বিষয়টিকে স্পর্শ করে।
jwdonahue

22

এই সহজ রাখা যাক।

এখানে .Cmd ফাইল।

@echo off
rem this file is named echo_3params.cmd
echo %1
echo %2
echo %3
set v1=%1
set v2=%2
set v3=%3
echo v1 equals %v1%
echo v2 equals %v2%
echo v3 equals %v3%

কমান্ড লাইন থেকে এখানে 3 টি কল রয়েছে।

C:\Users\joeco>echo_3params 1abc 2 def  3 ghi
1abc
2
def
v1 equals 1abc
v2 equals 2
v3 equals def

C:\Users\joeco>echo_3params 1abc "2 def"  "3 ghi"
1abc
"2 def"
"3 ghi"
v1 equals 1abc
v2 equals "2 def"
v3 equals "3 ghi"

C:\Users\joeco>echo_3params 1abc '2 def'  "3 ghi"
1abc
'2
def'
v1 equals 1abc
v2 equals '2
v3 equals def'

C:\Users\joeco>

20
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

এটি ব্যাচ প্যারামিটারগুলির (% *) উপরে লুপ হয় সেগুলি উদ্ধৃত হয় বা না হয়, তারপরে প্রতিটি পরামিতি প্রতিধ্বনিত হয়।


তবে অনেকগুলি বিভিন্ন যুক্তি, যেমন test.bat *.txt, test.bat cat^&dogবাTest.bat /?
জেবি

19

আমি একটি সরল পঠন_প্রেম স্ক্রিপ্ট লিখেছিলাম যা একটি ফাংশন (বা বাহ্যিক .bat) হিসাবে ডাকা যেতে পারে এবং বর্তমান পরিবেশে সমস্ত পরিবর্তনশীল রাখবে। এটি মূল পরামিতিগুলিকে সংশোধন করবে না কারণ ফাংশনটি callমূল পরামিতিগুলির অনুলিপি সহ সম্পাদনা করা হচ্ছে ।

উদাহরণস্বরূপ, নিম্নলিখিত আদেশটি দেওয়া হয়েছে:

myscript.bat some -random=43 extra -greeting="hello world" fluff

myscript.bat ফাংশনটি কল করার পরে ভেরিয়েবলগুলি ব্যবহার করতে সক্ষম হবে:

call :read_params %*

echo %random%
echo %greeting%

ফাংশনটি এখানে:

:read_params
if not %1/==/ (
    if not "%__var%"=="" (
        if not "%__var:~0,1%"=="-" (
            endlocal
            goto read_params
        )
        endlocal & set %__var:~1%=%~1
    ) else (
        setlocal & set __var=%~1
    )
    shift
    goto read_params
)
exit /B

সীমাবদ্ধতা

  • কোনও মান যেমন আর্গুমেন্ট লোড করা যায় না -force। আপনি ব্যবহার করতে পারেন -force=trueতবে সময়ের আগে পরামিতিগুলির একটি তালিকা না জেনে ফাঁকা মানগুলিকে অনুমতি দেওয়ার কোনও উপায় আমি ভাবতে পারি না যার কোনও মান থাকবে না।

পরিবর্তণের

  • 2/18/2016
    • আর বিলম্বিত প্রসারণের প্রয়োজন নেই
    • -পরামিতিগুলির আগে সন্ধান করে এখন অন্যান্য কমান্ড লাইনের যুক্তিগুলির সাথে কাজ করে ।

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

বিষয়টিতে এবং এই থ্রেডে থাকা উত্তরগুলির কয়েকটি থেকে ভাল।
jwdonahue

পতাকা আরগগুলি সমর্থন করার জন্য এটি বাড়িয়েছে (মান ছাড়াই)। বিন্যাসের অভাবের জন্য দুঃখিত তবে এটি মন্তব্যগুলিতে কাজ করে না:% 1 / == / / না হলে পড়ুন_পরেম ("% __ var%" == "" না হলে (% "__ var: ~ 0,1%" == "-" (এন্ডলোকাল গোটো রিড_প্রেমস) এন্ডলোকাল এবং সেট% __ ভ্যার: ~ 1% =% ~ 1) অন্য (সেটলোকাল এবং সেট __var =% ~ 1) শিফট গোটো রিড_প্যারামস) অন্য (যদি "% __ var%" == "" না (এন্ডলোকাল এবং সেট% __ ভ্যার: ~ 1% = 1))
সর্বাধিক

13

ব্যাচের ফাইলে

set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%

% 1 এবং% 2 যথাক্রমে প্রথম এবং দ্বিতীয় যুক্তির মানগুলি প্রদান করে।

এবং কমান্ড লাইনে, তর্কটি পাস করুন

Directory> batchFileName admin P@55w0rd 

আউটপুট হবে

admin
P@55w0rd

9

কমান্ড লাইনে একটি সেট ভেরিয়েবল উল্লেখ করতে আপনাকে এটি ব্যবহার করতে হবে %a%উদাহরণস্বরূপ:

set a=100 
echo %a%  
rem output = 100 

দ্রষ্টব্য: এটি উইন্ডোজ 7 প্রো এর জন্য কাজ করে।


6

@ জন দ্বারা অন্য কোথাও একটি উত্তরে অনুপ্রাণিত হয়ে আমি নামকরণকৃত প্যারামিটারগুলি, alচ্ছিক মান এবং সুইচগুলি বের করার জন্য আরও সাধারণ অ্যালগরিদম তৈরি করেছি cra

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

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

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

এখানে একটি সমাধান:

@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
  • ব্যবহার করুন SETLOCALযাতে ভেরিয়েবলগুলি কলিং পরিবেশে পালাতে না পারে।
  • SET FOO=কলিং পরিবেশে কেউ তাদের সংজ্ঞায়িত করার ক্ষেত্রে ভেরিয়েবলগুলি ইত্যাদির সূচনা করতে ভুলবেন না ।
  • %~1উদ্ধৃতি অপসারণ করতে ব্যবহার করুন ।
  • ব্যবহার করুন IF "%ARG%" == ""এবং না IF [%ARG%] == []কারণ [এবং ]কোনও স্পেসে শেষ হওয়া মানগুলির সাথে খেলবেন না।
  • এমনকি যদি আপনি SHIFTকোনও IFব্লকের ভিতরে থাকেন তবে বর্তমান আরগগুলি যেমন %~1আপডেট হয় না কারণ IFপার্স করার সময় তারা নির্ধারিত হয়। আপনি ব্লকটি ব্যবহার করতে %~1এবং %~2ভিতরে রাখতে পারেন IFতবে এটি বিভ্রান্তিকর হবে কারণ আপনার একটি ছিল SHIFT। আপনি SHIFTস্পষ্টতার জন্য ব্লকের শেষে রেখে দিতে পারেন, তবে এটি হারিয়ে যেতে পারে এবং / অথবা লোকজনকেও বিভ্রান্ত করতে পারে। সুতরাং "ক্যাপচারিং" %~1এবং %~1ব্লকের বাইরে সবচেয়ে ভাল মনে হচ্ছে।
  • আপনি অন্য প্যারামিটারের alচ্ছিক মানের জায়গায় একটি প্যারামিটার ব্যবহার করতে চান না, তাই আপনাকে পরীক্ষা করতে হবে IF NOT "%ARG:~0,2%" == "--"
  • আপনি SHIFTযখন কোনও একটি পরামিতি ব্যবহার করেন তখনই সাবধান হন ।
  • সদৃশ কোড SET FOO=%DEFAULT_FOO%অনুশোচনাযোগ্য, তবে বিকল্পটি হবে ব্লকের IF "%FOO%" == "" SET FOO=%DEFAULT_FOO%বাইরে কোনও যুক্ত করা IF NOT "%ARG%" == ""। তবে কারণ এই ভিতরে এখনও IF "%PARAM%" == "--foo"ব্লক, %FOO%মান মূল্যায়ন করা হত আগে আপনি কি কখনো ব্লক প্রবেশ সেট, তাই আপনি সনাক্ত না হবে যে উভয়--foo প্যারামিটার উপস্থিত ছিলেন এবং যে %FOO%মান অনুপস্থিত ছিল।
  • নোট করুন যে ECHO Missing bar value. 1>&2stderr এ ত্রুটি বার্তা প্রেরণ করে।
  • উইন্ডোজ ব্যাচের ফাইলটিতে একটি ফাঁকা রেখা চান? আপনি ব্যবহার ECHO:করতে পারেন বা তারতম্যগুলির মধ্যে একটি।

4

একটি নতুন ব্যাচ ফাইল তৈরি করুন (উদাহরণ: ওপেনক্লাস.বাট) এবং ফাইলটিতে এই লাইনটি লিখুন:

java %~n1

তারপরে ব্যাচ ফাইলটি রাখুন, যাক, সিস্টেম 32 ফোল্ডারটি আপনার জাভা ক্লাস ফাইলে যান, ডান ক্লিক করুন, বৈশিষ্ট্যগুলি দিয়ে খুলুন ..., তারপরে আপনার ব্যাচ ফাইলটি সন্ধান করুন, এটি নির্বাচন করুন এবং এটিই ...

এটা আমার জন্য কাজ করে.

PS: আমি জাভা ক্লাসটি বন্ধ করার সাথে সাথে সিএমডি উইন্ডোটি বন্ধ করার কোনও উপায় খুঁজে পাচ্ছি না। আপাতত ...


ব্যাচ স্ক্রিপ্টে নিম্নলিখিত কমান্ডটি ব্যবহার করে প্রক্রিয়াটি বন্ধ হয়ে যাওয়ার পরে আপনি start /wait java %~n1
সেন্টিমিডি

1
সিস্টেম 32 ডিরেক্টরিতে র্যান্ডম স্ক্রিপ্ট ফাইলগুলি রাখার জন্য জনগণকে পরামর্শ দেওয়া দায়িত্বহীন। এই উত্তরটি এই থ্রেডের বিষয়টির পৃষ্ঠটিকে সত্যই স্ক্র্যাচ করে না।
jwdonahue

2

সহজ সমাধান (যদিও প্রশ্ন পুরানো)

Test1.bat

echo off
echo "Batch started"
set arg1=%1
echo "arg1 is %arg1%"
echo on
pause

CallTest1.bat

call "C:\Temp\Test1.bat" pass123

আউটপুট

YourLocalPath>call "C:\Temp\test.bat" pass123

YourLocalPath>echo off
"Batch started"
"arg1 is pass123"

YourLocalPath>pause
Press any key to continue . . .

যেখানে YourLocalPath বর্তমান ডিরেক্টরি পাথ।

জিনিসগুলিকে সহজ রাখতে ভেরিয়েবলের মধ্যে কমান্ড প্যারাম সংরক্ষণ করুন এবং তুলনার জন্য ভেরিয়েবল ব্যবহার করুন।

এটি কেবল লেখার পক্ষে সহজ নয় পাশাপাশি এটি বজায় রাখাও সহজ তাই পরে যদি অন্য কোনও ব্যক্তি বা আপনি দীর্ঘ সময় পরে আপনার স্ক্রিপ্টটি পড়ে থাকেন তবে এটি বুঝতে এবং বজায় রাখা সহজ হবে।

কোড ইনলাইন লিখতে: অন্যান্য উত্তর দেখুন।


2

এখানে চিত্র বর্ণনা লিখুন

লুপিং ব্যবহারের জন্য সমস্ত যুক্তি এবং খাঁটি ব্যাচে পান:

ওবস: ব্যবহার ছাড়াই:?*&<>


@echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && (
     call set "_arg_[!_cnt!]=!_arg_!" && for /l %%l in (!_cnt! 1 !_cnt!
     )do echo/ The argument n:%%l is: !_arg_[%%l]!
 )

goto :eof 

আপনার কোডটি আর্গুমেন্ট নম্বরটি যেখানে এটি প্রয়োজন সেখানে কিছু করতে প্রস্তুত, যেমন ...

 @echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && call set "_arg_[!_cnt!]=!_arg_!"
 )

 fake-command /u !_arg_[1]! /p !_arg_[2]! > test-log.txt

1
তবে এটি ব্যর্থ হয়, যখন পাসওয়ার্ডে?*&<>
জেবি

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