কিভাবে আমি একটি ব্যাচ ফাইলে পরামিতি সংখ্যা এবং তাদের মাধ্যমে লুপ সনাক্ত করব?


6

একটি ব্যাচ ফাইলে আর্গুমেন্ট হিসাবে পাস হওয়া পরামিতি সংখ্যা সনাক্ত করার জন্য একটি সহজ উপায় আছে এবং তারপরে ব্যবহার করুন for /L তাদের মাধ্যমে লুপ?

উত্তর:


6

কিভাবে আমি একটি ব্যাচ ফাইলে পরামিতি সংখ্যা এবং তাদের মাধ্যমে লুপ সনাক্ত করব?

%* একটি ব্যাচ স্ক্রিপ্টে সমস্ত আর্গুমেন্ট উল্লেখ করে (উদাঃ% 1% 2% 3% 4% 5 ...% 255)

তুমি ব্যবহার করতে পার %* একটি ব্যাচ ফাইলে কমান্ড লাইন আর্গুমেন্ট সব উদ্ধার করা।

সঙ্গে আর্গুমেন্ট এবং লুপ গণনা for /L দেখুন Stackoverflow উত্তর ব্যাচ-স্ক্রিপ্ট - আর্গুমেন্ট মাধ্যমে মধ্যস্থতা দ্বারা aacini :

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
)

echo Number of processed arguments: %argCount%

for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"

আরও পড়া


আপনি কি আপনার প্রথম বাক্যের মধ্যে% *, এবং $ * না মানে?
RockPaperLizard

@ রকপারপারজার্ডার হ্যাঁ, টাইপ, ধন্যবাদ এবং উত্তর সংশোধন করা হয়েছে।
DavidPostill

আপনাকে স্বাগতম. আপনার উদাহরণে "for / l" এর সাথে মিলানোর জন্য আপনি দ্বিতীয় বাক্যের মধ্যে "for / l" (ছোট হাতের অক্ষর এল) "for / L" পরিবর্তন করতে চাইতে পারেন। আপনি সম্ভবত লক্ষ্য করেছেন, "ফরোয়ার্ড স্ল্যাশ ছোট হাতের অক্ষর" অনেকগুলি ফন্টগুলিতে "ফরোয়ার্ড স্ল্যাশ নম্বর এক" মত অনেক দেখাচ্ছে। আপনার উদাহরণ মূলধন চিঠি এল ব্যবহার করে, যা এটি খুব স্পষ্ট করে তোলে।
RockPaperLizard

1

সাধারণ @ ডেভিডপস্টিলের সঠিক উত্তর আছে। এটা দেখতে হবে না /? যদিও সুইচ (এবং সম্ভবত কয়েক অন্যান্য)। আপনি যদি সেগুলি দেখতে চান তবে আপনি ব্যবহার করতে পারেন: for %%x in ("%*") do ( পরিবর্তে for %%x in (%*) do (। এর সাথে সমস্যাটি যে এই সংস্করণটি কোটগুলিতে কিছু দেখতে পাবে না। যদি আপনি এমন একটি সংস্করণ চান যা উভয়টি করতে পারে তবে এখানে একটি নিখুঁত কম সহজ উত্তর:

@set @junk=1 /*
@ECHO OFF
:: Do not changes the above two lines. They are required in order to make the 
:: JScript below work.

:: In order to get the parameter count from WSH we will call this script 
:: three times in three different ways. The first time, it'll run the code in this
:: section just as any normal BATCH script would. At the end of this section, it'll 
:: call cscript.exe in order to run the JScript portion below.

:: The final call will be the same call as was originally requested but with the 
:: difference of the first parameter being the word redux (if that is a possible 
:: valid value for your script then you'll want to change it here and in the 
:: JScript below as well).
IF "%1" == "redux" @GOTO :CLOSINGTIME

:: The next step passes this script to get the WSH command line executable for 
:: further processing.
cscript //nologo //E:jscript %~f0 %*

:: Exit the initial call to this script.
GOTO:EOF */

// We are now in the second iteration of the call. Here we are using JScript 
// instead of batch because WSH is much better at counting it's parameters.

var args=WScript.Arguments, 
    sh=WScript.CreateObject("WScript.Shell"),
    cmd="%comspec% /k " + WScript.ScriptFullName + ' redux ' + args.length;

for(var i=0, j=args.length; i<j; i++)
    cmd+=' "' + args(i) + '"';

// sh.Popup("The generated command line is:\n  "+cmd);

var exec=sh.Exec(cmd);
while(!exec.StdOut.AtEndOfStream)
  WScript.Echo(exec.StdOut.ReadLine());

// Leave the script now. Remember that the entire script needs to be parsable by
// WSH so be sure that anything after this line is in the comment below.
WScript.Quit(0);

/* This line is here to hide the rest of the file from WSH.
========================================================================

:CLOSINGTIME

:: Now we've called this script 3 times (once manually and now twice more just
:: to get back here knowing the correct argument count. We've added that value
:: to the command line so lets remove that cruft before we call this done.

:: Remove the static, redux, parameter
SHIFT

:: Save the argument count.
SET ARGC=%1

:: Remove ARGC parameter
SHIFT

:: Now you are ready to use your batch code. The variable %ARGC% contains the
:: argument count of the original call.


:: ******************************
:: ** START OF YOUR BATCH CODE **
:: ******************************

ECHO Fancy JScript count: %ARGC%
ECHO.

:: ****************************
:: ** END OF YOUR BATCH CODE **
:: ****************************

:: This is needed in order to let the JScript portion know that output has ended.
EXIT

:: ========================================================================
:: This line will hide everything in your second BATCH portion from WSH. */

দুর্ভাগ্যবশত, এটি একটি নিখুঁত উত্তর নয়, যে কারণে আমরা WSH থেকে ফাইলটি চালাতে যাচ্ছিলাম, স্টিডার এবং স্টুডউট উভয়ই চূড়ান্ত স্ক্রিপ্টের জন্য ভাঙা হয়। আপনি ব্যবহার করে নির্দিষ্ট পরিস্থিতিতে StdErr ঠিক করতে পারেন 2&>1 দ্বিতীয় ব্যাচ কল শেষে: var exec=sh.Exec(cmd+" 2&>1"); যদিও প্রতিটি স্ক্রিপ্টের জন্য স্টেডিনকে বিশেষ কেস হিসাবে পরিচালনা করতে হবে।

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