Come faccio a individuare il numero di parametri di un file batch e loop attraverso di essi?

C'è un modo semplice per rilevare il numero di parametri passati come argomenti a un file batch e quindi utilizzare for /L per loop attraverso di essi?

Come faccio a individuare il numero di parametri di un file batch e loop attraverso di essi?

%* in uno script batch si riferisce a tutti gli argomenti (ad es.% 1% 2% 3% 4% 5 …% 255)

È ansible utilizzare %* per recuperare tutti gli argomenti della row di command in un file batch.

Per contare gli argomenti e loop con for /L vedere la risposta StackOverflow Batch-Script – Iterate tramite argomenti da 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]!" 

Ulteriori letture

  • Un indice AZ della row di command di CMD di Windows – Un riferimento eccellente per tutte le cose relative alla row cmd di Windows.
  • per – Condizionalmente eseguire un command più volte.
  • parametri – Un argomento della row di command (o parametro) è qualsiasi valore passato in uno script batch:

In generale @DavidPostill ha la risposta corretta. Non vedrà /? interruttori però (e forse alcuni altri). Se vuoi vedere quelli, allora puoi usare: for %%x in ("%*") do ( invece di for %%x in (%*) do ( il problema con questo è che questa versione ha vinto ' Se vuoi una versione che può fare entrambi, ecco una risposta decisamente less semplice:

 @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. */ 

Purtroppo, questa non è una risposta perfetta sia per il modo in cui abbiamo dovuto eseguire il file da WSH, StdErr e StdOut sono entrambi rotti per lo script finale. È ansible risolvere lo StdErr in determinate situazioni usando 2&>1 alla fine della seconda chiamata batch: var exec=sh.Exec(cmd+" 2&>1"); StdIn dovrà essere gestito come un caso speciale per each script però.